????ࡱ> RSTUn-M>Z+}#b8^PNG  IHDRsDPLTEf3̙f3f3ffffff3f3333f333f3f3̙f3̙̙̙̙f̙3̙ffffff3f3333f333f3̙f3̙̙f3̙f3ff̙ffff3f33̙33f333̙f3ffffff3ffff̙fff3fffffff3ffffffffffff3fff3f3f3f3ff33f3ffffff3f3333f333333̙3f3333333f3333f3f3f3ff3f33f33333333f333333333f333f3̙f3f3ffffff3f3333f333f3Gp2WDt4Hl4K_+Xk7CK#sjBaT&k5bW9WDVH)rY&@3(~RK0 :' pKR6pV9iBqǦ`Z:P9'|`K`G6tG+, f)>aQ v*%l#VtRNSS%bKGDH cmPPJCmp0712Hs)0IDATx^͝v"YG5xOD)&zD9(Ț &o9E:G.\v7koC JɣH}3kh䌜xo“vN2vZ#w8~DZk<F#>ښE׆轑3Hd |^#4鳅_p/^Ћg:/C;({w_^}=jqabı,"A}\^o( [õ7`8$I(vѤ8Pўy1>}򞗇d+zd2ď<@+v*_^w[AqNs{a ƃ`ऊ\  0clxWџWŗz 6Z-s&|[; \S~%>QuU9}G4 =kzj|&-֤NHZN1Jq;,l?ݑ#6\wYj~L9CՊGI} U:_GӞѣ/ R B wzyp2cO/2ǩY2>zePpwn Ek^?*M{XV쇳e$E\u,= &a>BW-;L{e&1W$U:3 i99GĦɈ>VП/1QaEt ,Q9יȽ^gɺQߥ- n-% xkׇw(_'z{3c{9իaTs.KHw"px1GWܥ|O'Oc7$xI 4YAއ72CSݑ{5^Ff;AS͗ Oߌ rw9y{#L<}> GueSq!Ld/QQ?q{iU/v9;pC!=\ [ p >i"~g8;Y=HAi'wOx#7p-Q˷$S' e9Lm4JЇ$JԫY䜡:9^ M dj-oaIMwCO#b IQz$/ލqpy3GHk(5![! 2 *Iح'Uќ Z* ɼɪsxbo艏Mj-BeLtfyS[&jg[R,N?OXp4qKvB<#eLḽߺ@sRcrD>\ ^~29=a#Ym]&W+Dv|{ |/ȱvҺ}wfN\Lu?ΉzNТ:]h[Nn#pK.0o!\i8ԻsU[wYʣ|D韁GA/$zdT'}`g8Zv I["'zn "2 WC-O*2hQle"_$6~bb""7-`WI5zxM?}O}$2XQފM0vFdqA[Uj9Q2͔FAguNk'?}+$J |>9&o1VQ9,Ѝ$O%slAb2M_Q`!OНK1ːl,wM5NriᤴU/WJIHJ O>)܆J3\/d~=utp39oMQocp0Q/jx0E) xWyfl HNB>I1;!Eƚjeի+$gp3ޥvi^iNW Z8N!U>jyZhKa2ZAQ`lHj/pYM /)jZg} lќ⫡xRE&jݠvA? ( (:G+Z+“Qe?ױl4}_ ֊jP  tiRP#5"޲`j4T*Rr7dЗT,ڃ-$Qz%4NH k6?A^Awʛ)j@OCs:s)ҕR-i6UJПQ:iZ̡̋EbՊ{}ݤ0ҏ wbgբjFNFI}qNGռlA-|Y(d6o1EVU(J?9#s:p2{rB}~0{0mML<O"B|H$bQ^Aj"sP=1-?}лn:xܐpȪ(–˂Dk\πrB(js?B j :V-S+jD+OF5r,B }>ռooZD慃&ڶr_Y34';p!UQ= zn#c>Q`\z0(!$IFdXNu8gO+"yl+Qzsylt8mnbT~D0b\> $c ڗ_ WKz2 W*xS'cPMphi *wfYVV4g1_L/)}νإ\$-Rd[h?܁c74v_7H zK7g5MgvɯiZ^bVFn$lb{d[B?N//(.4/HÕTz|UqRȥ[oT5}R eKTve|tf;Y'Zy]mʠ8nMoUvЎ7,j?lzdd,Aa^dm^!RSEC"n5,x=O?,7l\^Tkj"y7?8ᇻ?. o&be*Q"f?=lMEB{fgCz?M8;Qϧ_^Nw~A[FZ؁E03wJo\0 6j}E3n1[t6bsxKҧZSds*ZP\^uBJ<)U4d46TjhyC8(`+օ>\\| ,ڡ9cBX 1K ,]ׅ4Y,jυٛ8RWG./9_e@+[JEC ,on/҄u)Tթ_/8U^.pQa--HL4yssSUki̩"5?&NOOEoz KD0WI`LTrt] Ml>Pvޮ@%|tp{'`UiOqf :pc+C΃"5gUBpi>~[Ou>3<$vxj!;B)jo5芬M~Oƅ&ڏ;Md_Iu>N/n~ zVPP9! >՜U\┺`6UbYwN/蜎oO Ov1ۤ-QГ"rat m+&_m;wR3(5*Mxj6o.Ɉ={ˍ_Ui"UVDAUSVEw@.Ga=`CЅ"Mj3ݷ{\N+8yzo}Wkx:q1p` (81 5.ֱ#a¿jow>mѫ hF @S$ mJp.9"1E9 YW%㙝, ԉ#JApE>{+2 WfЊM@Z>s9g/6n7*{NڂO^~.Gd`q>ѺٻF޲"Do7IbYq"lXn E5Tf;3Cje[QR(T6NSпM}XE6;9'Krc=GyKԛVouj3??ܪ$Y?ڼV鍔IGHT_&l&\̏_}2` zU2Ӳ"(xc[0էo.|04Ar__%I`KLeR٠o+8zW|ğT:muzVăo)anr>AOT[0lQ,E&^|K%#Mg@W7=p ^jP|3PNL=j^&ز{FV*zQ<삙4chfap\%X+VЫIq̵\Vmd \oV;5I ㄫM^47.MP##e,df-j]zvgoe &\8ܟ3{nM`܈WeUb.kg/Nyw"=ir({&(0uLjBӐԄay|Կ=~C]ۍJۭ OJuDoR!1CxMcw|6œ?AJ.Gf$6s[o6͠Ub] ,;6|'?Huitl$NOAaahFs4~KpN2͡gx#s8~yUnejV[ghtBA,l2(N``F(jRq6صnЩ卟~1n0GBhu>wɊ$qC;d>?w4b4Gӄݾhg+)5]YGwx #x|a/@? xM=#߃3. v(mΞ1: \IeYfsFYyzOMeޠ7E#S:]v4sdnawxEn vFpPG*[ 'K֝P|)هM^l"AP#}_,{<#@G^ȾDv'0.?\g*'5  z9}S$ek#7ro'D (55jHy햧'->H6;5(V9cK1'_ެwN^У~; _V!b+F r7n7G¾a=[V:UAs\i4ftۑjXi9_g"l=_ ^VPMCh<ݖp!h)9Ϊ8S<"R<_pOs= ŽF@m "W77[S")sA.nB(1YnzU!qYt1hX6e8,0WىW}yuӸΏ ?iJ(b_0ň%4gPiyI%iW)hyeYa~.@k1 #R\#Á- y@C㏦E!B %T=Z=_;c]XeO"h*PKƻ\c>0p)yr^UpLrwvt=ŏNf;x.%jUY:Pjbe1[5<4l,y]:3N \o9i>EFtaA)U6/s~ڿߕ/#dP2<nw cffel@P:GXfGs˛&(Wf!f[C R=9\>t~".hTs= Msa۸i$pu!MktsfW)} ‡10çar_t^x^^{(S~TɂQ5vL6+XbUJ0v=if֭RCPgܸ_z{DUÒTm)K/ܒ-^=}O&k1L3pbތ[>×9ޚgd=]{#L(ޡI~͠+TW<4Yh*c#]:q8w?ZȖ봑4\eQȦ瓃+D}]|fw{C&^/O:"Vw`?Ӛi[jіfoT2O$ GzAOzX:%EʣZ$͓QִAe jXH5җ;ٸl)|c <>t85%|@ы0pjGu>s]#D𨭸U4Gߪt`Lj4>{F@B;Hmż^^X{Au{d2OG А㏼x aJ=6HT#9Z<)1j>';jx4R2vfķ>GgA \}C*[ݢGog; z;oԷ߇C@lSؗL X"SgcJ@x +}K>h>rJ¡ut2z[٫Qf+xBi^շoJTFBVrz=lxd/eX::X?/m "ȐE_e"þz|_z]sTTQB<mttCiOL۶4nl1}1{ b{9WeŇ^҂]lut%Eg_Zw;<??|/ r).E{|xgot ?}?_,~PfJ;c&lMl稯6+~';RVT~Dv.w\ׂwoKC Fv*Ks*8K !\[ze/uOHg$[uIy6_8.03EdNTdHXL[<>C/Y?U~Cdv# (a6gXxIENDB`FM.Kb|JFIFddDucky!Adobed0M   #%'%#//33//@@@@@@@@@@@@@@@&&0##0+.'''.+550055@@?@@@@@@@@@@@@"!1" 2A0P@`Bp#!1AQaq "02@P`BRb ]<@ L L L L @ @ @@0C110C111101h)1 &4C4`X B P&mP5Djcd!a@&PH&*mP`P&`Li0L*V! Rm`@ R0#d)AՒ0@ eC(Ę&H!(&Į@`b*D b(kQ= @8hCa4Bv@d)l%04&1*BT)`*BJ@P$ 0 0C@m4($`0t֡7"$66M6L܉M΂]!*bW4KCB&m Ar%l̤!ЧD" &h&)Uȝ` \'rTԀW:v413UMԌMT L%h)rM&4CVhhM56Jj@C)$s)"DPB!bI5M%Ы;T 5'LJ!#BD , )dڵJ 3*Ն{gdM*cD[ t*P9lv(RCW7;D)Km\4!;B%N&SijQi Gu6-sIuPJѐKe"+455)qM\h7$Աԣl9lTERb)#L;Sj7\j@b^*d&H)sR"$4qBֳr+!M⦚t4b؆! i,őYɋ:NTCF2RK-ES&5Ahȶ!V!CWpk EA2YuKFEѝX)D<MSL0n*i)g"gCYZMUHf)5,WΤLVYUQ)H$ܦFѪLQ-t 2 IH ŠԄ!n:R̩X芫U()&i2hpCDZ!M9CHLcBZk*)8.H, CT;Lk-QkNtC"Dᗖ UJTR (*E@IE)T8n;D]2ɍr5͢"vRR:J(BШ:άj8)= t"I$&-F쑃N:{N$r*`K#MmidTy5-y [tT &^ L $hIHґr15rRPHLGSB D5cYBi (bmɝ͔ I+p!M(T H].I(cyҒԖ-R%jjR, R43f:TR ֔Lji̹Ji2t#+:bi:I/;h9rf:+sV$VtW;! j ℨbB*CYZ)LТ`ZI.t%g TU@LT8M^T8,ILE%W%EMAJySIh:$bo!zhpgA4rȡ*!ŚgHGM YY t*D h*RB\i*M!!%T(-<ǦTY()K$hJ!Mt)b!҂BY$RWU8)46p+TFD%X&ZB ZZMaQ(B(qIRr4!qPE6Efm4YTHZ$ڦuB03F`Ӆ*hڌ i RUC@FU&PEPjei KΒVfX4HDH$b*,&\cj"ª ""*P:F "QF1 HAjGQCΓR-E0mYN(s,kJUz,-HV ӚL\`E;j=3@, \ZrJnΔʧ Rh-Rgm IJ)(Ph!֒HES;@#d"(K\VZf`S0*5JjƯ;cj@A1jPA"ZH%TPMf-& R7H4gT(%-ҳpQK96#U t"4iٛmf)zeE^VLQ*mHyI[B42j%˜Wg>.\xsυ/2Ĺ~>g?sW?m~|*%isDRyy_sQ?GfyuG'^|TK_c?om~3'q#̦J'!:%N!rT \J*ua8,W(+L31YNN%qA>Z* Lsu"JOnd/Njl'2JTcp#*S\C )1'+l*\ RJ\9~)`$FWPH `ms?*V|*%FTuQT娟sSCTvbZK\LJ*אn|:SGu_=Zf7#fuz2St 4>3AeJJ^\RyԼzQgU`r]8(b<˱_}M Ϋ x\E`ΪXҷQB6@jZ@WS+2;Z@\_:aΫ2sͺ~,3P9~@%bKY\F*c-2RfRa'\93댧ZߗsF3p53#A'~0^ Ԣ<tY>%q3&8qST.V%f̙ͦƉՅF8nYJψ ֝M|\PK$KA̋A4 Wg/]8xtus®TLNVݼT:rVRμhƁBΦLS^SK ZWeKY|vtu9.gֺ u gý:sS9j%zG%2h:Os+:s̪;>+!h3ƙԈǯZ־q} 稢[-gfiYh9L eW|gj=N.ZW3|fgը|m$s54LeZYEX \{z.kh&u]L~ʣ\Lj+4&3g2phhih:c /^P{uXI8 sܷ.㾲Bkئys +ռN>spr0r Ij [i٪m. zĩH}면S48f1q^+=g]LB1?Fj&EWePďZ,xJ{К=f3η3,&r&lZӠ f!QygW]KC8rfi(Z3膝j?bkZ~ѓ+4)=s!ӧY3tc,Uֱֳ'f ޻KkkٜaeYgi sZI99ήvr:֜ۏV֬zs>EVU]3>PukZRS\^Gp tt[}Y2h3zդp̡3F yMTrN&CFIRR!fv\glE=k &Fu02J52g>C r #Lg ;^Ck0r3DW_9WNPT;0zG9dkݪQlbkZS׉*Ԇۭfjy\ǯK|䅩{K2ag/\KA)5si2+w ϯZY׻Y&l3u]f#2L3Z26GZӦL뙑dΖk-_۬c&}yusf:uc= Y`WJMoks4\..u[dkM @k[@/E{TӠZ[LʇRkNoA&7ˬuɕ9E!T}3:F :u~7٫\nz }73f&~!v&i5+C=o_XL4\8,Q;t=E2N-smҫy]iofܖ>p }ۂ&8p]/3J:׊+j}AQ˧3)ۼ`HLgZ+0ˤpjۂ\h"֗|| t3EIi=khVӟ̌vc>#ޥqtr|gZYs:6͹ Y]R/%:Rs;\nS} kڱLk&=iXsp%[Y3s_ 4崪qmQnWU0C'mS`%g GZd\ ѫu dz'gn]&4Oa3Td3bWD3zgejd<!?TuWKLZ;๜gJYx#6@Y'q7h͝}yˬƒi}?!ZUjYukgzLoZ@dkG\qY9Y֡zkt0&Bj~EM =L̜kjtz\g{>fd9fw; J&?LtdQm޸[gXL_jQ֋&NzMmRoE3zz.z#u,u 1NiMkc}rL=SLќ8Z8Yz^&Z&4taUtEsxijy jAL 82'X V{WPaPs5aheHz^X۝}=ymtiɽvqƺ&W[L:0¨ ɝ+32>i7sLk][U HR.bG-huYփGLjz[YiE]y=e'p?X,Wح$S6)w`\wXָ3kFsMk&~sbܜDUh2L]\榶ndXOY\OSg:IPLgmu{Y kZBYY7cז&f4[=z=ecttEΐOgM3 g($|UfhYD iLg&W5rkZרɐ57=z_^讳Q8ɜx[muvf[w32{3f:jvj^ W׎ hӲ*f >d5ՎΧ+*Zl pT70߱ ׳A7:Fpw NçHӭ:ukv ւvcJ2+zSH.DJ2t:20h1C]Mju\:z{k^ n PlPM}{K5Z\Q-[tGPwM\܋Hp~V}}OWK9 ` p:S1kZ3Ȼ -.oٝls?&yVg-ރLtAߵrU%C[ӤzΤbjcguLiEU^1nU ћV ?]S4*zItg}Wι\W9'5m0S@Jjh*h&yR'l.z{oO9oPRaP=Gc*ՙ,KE,-*S}5ut' ٸ"Egf;]b~jf9,2`!ɕ9 p]n bQ{tNՓY`֖tSZ3! 3t6tRbgV]$p2F_^lk3GaDN3fspͨVrCSԳ&X2ٜkMT׳]jdvNC^ͺskַI1r^ӌE֞]u%u.3;9̴2bm}]_c e֮dkӭ%?4<W 9 -ֵN4G49 EhT@!A9aUtr$҆yFj=`ZsTӘ23us82,CT\ ?Wn-r:=}M[mr1jV3M=ӧQthƙ ˒sz֬X%-]gU|odZ9˿c2-s5gfD\2kSy/KFRq[7öuvoפJ=~1Ss?Q7ˑPH )fɕEۧ9=sWfTifɱYɜQ9!o fg,άond~t̄!,Ĭ*FCy v|)ueIAm٧YxԳWĖt&!C&d@ofUϮ\\붷t}:cZzjSNRtI&WAհ9Lg0ݲNֵyװ,=giPu iΗ`Mf}uޝ`yp{]=(c7K%Z3`umJf193zkyxk|s91F; v9]1J&d]]ۨt+1׬4Fg7=}M_ѝӭQW)LQC [cgf Kk+3cY5ԃ{?5ۜ^Z3e8ζh'[/ ڂQ_RfulpXaR7Y>5~3Uu-bNˢtX煶hhgדZӦdY]6N;jg$:g?/56ڹ;';A+,zKg YZ24`&Fz9E.:ւkLtֻ8ˤPem1֟f9÷gWBR-^ڜ(ٜn̦f*N{@YYQ4n J4@3y0K:;\x3ev3]9|`퐷RYvO-&F;gkjv3/Zz(u3&G~VvkQOS&uPʺgla29ʱҹj gZgʠ F\f{d@Cvd&}zZeZ֟bޔE+ KI7vO#isl3H+35;֊jd=4{49LwåhS:Mp8*-AoSN*g<&>nA m^g3Qδ\d͙U9RM.5̔vtd 'S.6N@H te\vV3#fvjC-roq]Lu>~>sMN)ӓ$WZui1Lpμ-34k)Fknu֮uDX2^3g zW:ڦz2^ەnmhuRd d:nnp8q=σ9f@>ަyuYΪlL(-\.&_~us3}MCfuh-0g2+gx=9g!9=: oP3Pѓ׭1iZ18MN\l-e6sS󬼺7ty֪ Zjioј fwkJss8~֚sWY678}9Ү3zd4teSmƲ/Zæ7c|\g6fhX 3gétֵ j8>'ΉVo+֕1< .@Z2ёMYᅝ!I=hC_֑Uq[_Yzޓ}cKX]o&GJP S흐/SFQJEo9W띌 :GUε7ZB![55i)3v+P֕dє]mg]F:iMɌX0j13{{wnڿ_g ~׫ޔ+H붳IOg8Yg7ւ=m_:I'n7zw=@e+mOcdmsײgRe,4 *uSzN`ʍ̖zdM t&@ڀڳ\vQ4esΕ:[GP3_mVz##uikkFC+9oƴ˃ \vӯ^S.I%#3]reKW3Y׌5UP"AXGk[\d7uk(5{h*9Ajgmi]fhDk[PfB:QZS5iuf9sUh/AZbdq}/Յκ.sS) 0PuNdɭOYj|ƃNګ+3Wm=FiN@"ȩ.3%;d@M+3dəR v*g_ml5d /&]fz5dg[@&2vӕtk_>kzk kFQ\%芭Abz.E]/RgMN9)C:U3am2s[⺉,Wx.z:3z5gy 8&1Ψ5 tYwZtʏ&M!9Ӥ 粘5٥ Qu0ڌjuc9ˤ5پawf ^IdPJϪ2aDlk}ugBhV;It-P{fjM+ 2̔W*ՆJfsd4?̦ic] vjsu d}9Ur|%;/|z[ +Q֣˚OdOol&{ہKIˠ/ZwYE9 2UE_KYQg;G2ڳy>83 }WM!jLd@NibWEku?!.h7qLy}jJRȰSvX*C 9+Ygrj9Kc :ӧ[.ig%{=vW)bGtzM'Q|> `)sQSPY_fR3Pscۭ?&N{hȻј3P Ӑͯ V S{u uu]A;?6Nt0a`}g yY{-q:X4vm)u:XV&n.OBB:MwwΧ3u3χ>4GZt%S/KKs|̴W Ӡ?[Zt[w "b:VᴎOjEVH{.Py\jK b8sDF-M73WUHk9 4|`V|&AYDl.ߕZxekHx*ȷ3\8ounRƧ*\9vbs4itLD&P˖KOQV\x%Mme;{2sρ?gUy3;Em0Yrw?μ2~'i\[K.f7>`*Oy/*W x'5iep:Xp\, -JKeiqcaK.XBY/,-KX>gυ ϋU֝?GN =B:_ͱ]p<|Apj[.៝kWpj-˗ -Qbߋ ϛ|οo7[O_c?ޙrXoڤAr,˩dXrb_Fܹ|A,] ܾ{rf.eh-T *Q*T(J(~u+J /#ZX<~^VX/ })~}1}^JZƱ6/Q1}S^FY௢>'n " ~ִ/H%^Z 蝉xD/Q财/m%au^N(R,Y_(͞e*ǯ2 +l"$2B<'9֛H=Iz۶1 w.4 (󤔨y#Y[v1>Hf촲/lI1 HX,-<"YegYEU!6'b",Ouܲ[,b#(&%pR6z",̶@ƊIt( 7?*R<>Y"4Mg$x87vLi G''B,셄7#,z # ^FpGܻ!*<|U4Ydl>=W/mlD$Hu^M^œx+؄.HWr$?sXۤ]'81G y$|"OR[#Y"~G^Im.Gӧ?&l(^#28{U"헅Y)GUD< U{ݎ?RVY%r$Qt!.}vD%A#dm3OQy-/<b'%܍4܈Ȃ̞ p*'+ԽϔQ;rJn:q@^r4/ Djv|Uuݍ&u^rEOcFK'b'<7ek;w,r&hOɩd>%*%XK!C?/s.ǩ䗤uT1z.R!Po뫇dR> a TY de^k _rs$y=>]} ^i3/ m K)d^cܓ>7Y2F0ps w>*xX$Z%-F|Z ^IL?r-% -i,eID~B!<'O$`]R1,FB fbEScKG-^M-r?o='粖G W$uSu\lKV^엃0>3i}oZUU2z A1 Tߦ)&2F^zc&YHj)i$d|DK'`!T^G̓2yYUeuC>}U4ݶ?, f F L}(ne +KaW+!}Dnɑ$MdɊ!)DĒJV)8^ 1֓"^ p5 زVv"::^Ic܏>='Otz"Ϗ_r.ߑ!Agl=OG/YJc+{ pF`Dg9!T)݋b1b1l͍% ampz[ N4%lKT^gGe Qx~‡5OKW'|S,>p<<[dNt='',m-%^I$=Kg>=p"XđKj/_"Gė WW2Q/G4|zgI^ļ uge#?r/ݐ@I#@Ң&OGv8^zp|J1u%`5nW>K"X>8FEz-o[%DrK<kKVؘ^v= T=4mPr~N=kK(q/Vyx%]pO <ɛ Ƹ+rbH ~;ݐقVH{\K-bIc!`RBPK,)Y/,HDlnB? ?")~o2>%ɉkCK/F~ڸɚ/',|BSLoE剡)Z%'Bx)$=_:Dr%=7&kOb1,ull@B#KE zL6F{24Y=-$py&,ɛ9") b%d2J )^p&g>;#/-lD% D<]q6ϊB\  %9>S|GS3$DuvCgw9JK11DdU)G]d䅒ƕ!{K,|'=pR>H5/cI߱[mDvB"`A%m&4Hn/Qd ,]QBs|b,n^Ii-%H|V7eř|mTV/,Ci$4l] U/$K<4sI+'ɼ0%q"%KDU]/HHވƊ9L UM񶞂HuN+rJ\ !ܡ1:ppLKj[?!uرq+#u|3ؘ0DR[dnG0K%f)99&) 2z-pHp!-/,7%M>+ܡ9eFKtX-VɊ'n,F[%BX'%%A$Lz cyvOgleIHV^KbV ~Dc^4$xG!:&e('^9{8I I}nm[nN[""u:R"F$Kؽ*+,#mS.3m Ƶ^>)%g0Xt]UKeBҥ~670(1GirrK?:.X )!a7%id!*X8Dr# Qc O'XJVBPUlN|؄_bt!{Hd,E[ݑd|)pxe[!+/) $22nF!\KfD_Y(L$ X)DbIcs.2~Tgq)'d ƖNǁ=82':{2Q϶:>J%.7)ANz^ Kvxܯv"VĞXK>}<.Zxbo?bd=zX[igNK$u%ĐdutCt~Jȧ#HD!-du=DQKLݒǨ#_BK!HP[܅YPBx<OjE[$ 얆߰TğQ-=! 0su*D4EI JD|Xۢ6-A =Q=)x䥍ė)$!"u:rd_Tʢ[hIzHH\\rd+|Bnbl)nV CnngQ,e=^⶗-wnFUB'}" {"2VD`Ky>=.ܐJع& ҒJ>)D T u@#d'/HYnζGU%K#cX)y.>]{׹Diz6Og1 #FɃ2V x'aP (^g/bom[-0f{1dnpILOkdrJ'ɒdnN`L8=-K,GZ>*KoO-u>+ܕD䬓="p[!/ $H$}uE G&i:!8!)6KKqZP;VGd#t"4yGSO'>]+C?q%@o}t?g9!nI IgstZ$l``F?|>O'ѷɋ9zB]3BtIz#t9# %$߁,$َu'_y:rx.1[[BҶ'Β/B":u//؅ȥ4)r_n$AC{! ،dq=6{a'ۅ*.ZrBҶK<#<*qMu\iVF#q>n?#Jz^7#m% C>tKΒelY(n(d!aoLQ*,s 6Uΐ41N%!|V!c{L!g}>]^䯹nX4ް^ &䄨%J-؞E^HP䎾Yw,/$ox<I$x2^4pz <DF|z{9 ,//JP~GȏېrmAI7S-%)?' ,N,)$\Kܼ"{Vy'7>[IjY/ܡ<^OQB i .9܅x$"/|-lN BDrU-yjO$NF$b Me< [ik؎9"HE{g Q`>ļQ%))Ye[zL(d"<*-ؖGT>ݯU,Wө e~4luoqN^9.׭u4%s /bȖUٞ Vy/%i.x!nI' ,m۷]" z[^'$".o'& (Q}<:Fd6Y/; r?(ΰFM$9%pY.7*ˡ.KrlbXJϗlLFcs&Y Oٵ bHTOpB-EđY)zɒbtVγ2ynJhY-/Ư=(d%//bYCycOb!K)/-Eg,bY RzK$} n3SQ cmcbLd-+$,/Y(xҰf bXoIu%x%VBy'd4%;'8H1&J#a;Ę"`BJ,^^璈TK%kk^#G)pY &OmH$*2%躱xc\P9rz]Bd'\唰>ݷ'>NbuR7N|bK& RDI"{R Y"~p>k}{9gb^ \;~J#/:K#9XM𱤒1oqU2Y%Гs sGK6~%2Iv1//rd/("hXųԷIX-ޓ;QB!;O{!u蟗ૂ۳6ȋ3 b^u[w*cmHYgedVmqY?'C< iFli\*9b[&rP^߱J]DFD>K~!amO:yx,ܷdp9r.O{֘_'PlϏU<YjķODh3d =#s0+92{ ,g5'Ǫydƒܻ̕lL^C% /}rVH_qy,[,^,m,]zlm,v)rBB,dux(D/=Ks#J pLI.ddǡ,vEh=M#m<ˡs#_џbй&HW$!Y'/ Ix!k%R "OK!-!{K|^N|fX3$bEi ܫD$%c$$6%/Q!Ξ~ڷf4dZI>KYkB]A?KoRx(n/^^I&~ >CԂ +=~ޱ} ~Tk o/^OV_G/QsdU'J[*k~?_ Hkk*,WԗWgE?ӯ;je<ܩ77777777777777777777777777777777Ŝ٠Fr ~~PEVJFIF%%CCPP" }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?|&Woیvok2E+{FC4ndıol~JHoQʶR\65`d ?g bOgkZtJFA0Jӫ0 &1,~:jm!W|A[Ԙ>wv8P#p׆ Կ&Z󶏒9TGh nJ:JN-לU^=[ļZ5 4DZ=|Mm01Ʒ3ir"Bx>,p:K+ǿ+VMHڷbyҦw I>w1x7%:ܗG7>#{+yH&ˀa2$/X>-.9f[]Ѽ n@cifIBv;k-ῴnJl0';B2:uJϗ Q>NUQUr=;GF<}*bzloHTPl0"r&-R :43dgZ12arG^?H_'ăo}BU9[yu< cvȤt_>0:c旬Ś;G>xr#a6X Omo:K\,^Yž"Yę*A,:QL jNI^se*4*`ӍzO}:;Wgj6Mk}lt__v2Fz2}VFb ؟B,3C]0k .del,zN2rXiq+i~3ðD5sK7-/(o|-fDk̩{:O|"q'}GfK}.얞4lu 73@ oL*n1gYEwW&cvwm)]^&l>R7S|t^c w*ahDd߶U>iWŕW ݼ Y_J-Q^OIq;i||Mu9<(-/.e~'|S ;VhZ]KyVzTM3'_.Nζ I=P{Nj"G+ћhԌHo|R_vW߉c>+6D#/dG:t.ڕd]Co嶹㛏}QvZisQcY ֍e|W }ao‘j[r\ιe"i <7k~(\.tK ^Ӽx+=KSԓFXzτC)sEw `s7i%h/ ttDͤxԵѩKw=žjqfo%SeRWjכ'*qX%%Nq~ͣeU/*Tp*` ^.ZѣF* :~St;$^ 6=nCşa7$9_j_5HRxI#5dI]dj㿇n-WQ^B4=NmGR;$\n'];OJWk}/X. rq'MO.͞Ⱦ{=]6[]߭޻MWSL^G 捪fki 6-w6YC*>Y氊;Dn^1Y3gjSr\kJ.]%N%yEEr!͆ƂN2 x))J*O#SVџzh4{ƻ|zW~>|P|> ZM RGX \}$qZ[}Scx A]w:/xzj{_ XiW_k?4OKiom} i~ǿ .~?LG_jѣAoo [=,owCakxx[_oEkii|<ޥO5ڵ)UعW+i*Z96'u)ԩO9J+w*[;JXYNk Jv\)˷ Ip<=fiTxʥ|V"(UQK 13ZT#xK7Qk4Mz _Ghw|7ugp#|Sx]&֧e*lOޏa|1og%WOj#jůE^UJ_ï &}O/^)K 35S}]wCO|3Ӽ<-Zŗ Zܛ]Fƭrcկ/6Zq8ξaS,C 9(8SnNjpWK|: 5d1)fƾ""jhR|*_#|?Oڎe?n<)RFGcPiK*H!(WQwّ~Ͽsc >;Fm#wyhh1_Ka/, 9uZO&fյ6 ]WHԴ<x-3FӼ76O[_hֲeh]IokgѴ-3L}nDu/i$^.]VÞH5)4<@vŨ;k |Ok>[zޟcj5XtBzd"BvkX%kW6'hȥ$+tfWB60fH?VS;QS*0؏f!Vj"|9Fjr敚_癟9*b2LUe8)QaRRukcgMNTV<,6Ѡ7ίW짹×p6kuo jO4$t}-ƇYkˬL1t^FmCUmk7P`_B0/.o.ug{\ir' &K,4k(]4:MHm`KX!35;tXēI,4͖>#5Zm?P4=Al5Kmf2͔kc&W<0،;!V&/rEԌMJ^ZQWM[*ҭi:R%n0^Z$stKxM6u%Q._rg GN #WQ[Y¿|7ͧV#uŞυEYkf8uh{pm-?_{c:6t}{^|Mh !;r_ %t/6W-+şL]*ڮeҢ:pugYRS s1W_J~6<9+Mr .KxR:iu_  KBY(nK&7AMG2xZUxnŚf{ BC6BD0G#l>.|}j\I\1owgDH,MtjQCZA}/5kH`vHQc *)&Wx\%F:)_+y7fݶc+|zZ1i7<#Aߨ|9֯5kŵ]U lzHJQD-.d`cp$n8#?N m;;K;{]5+kyOi.k)x-oO-&S1-խ6g:|{}>P :)xWF  `u;"&Q 2zwcX\jȯ^`"<2E VjfV '[t%\ a{~b+" [5ǃeqR4ӓ&%/GO.nO`CM\ܳ{^nEkZ-| Z_ |Ome#2m,I/"6~k-G\Y^#:,}sfΪ<Ƴ.eԠVa{^^XH;.ljZ|ޭ5%ωv8ʗpMfi-,nbH.?W[#1)akwLMUH G/Y^zW?<W/_ 24:~sO_> Rl|_;M{?:K[Q/|B4hΉkN>p¾冯x4 ia$7,⬻\غUeZ4F:UYJJ0J\Fs?W 'y(e67K>1Ɩ1˩Rbc ROKK5r.u %a+Ou &hy Er/ ʓ<9.^/c{iKb"-ukeSu%MQ)mZݒ/>6>,?G~x ~!SST"/Rеm?YеKYCME|CQe]6Q3RѢVx,3k`1ʞM~Gpc*a:QJsu)?fc)JJiǟ擵+CդҔjI{)Y+jvMiun Nϧi:>2ߴnԣ;WR{h-tDw9Rim.-o||EBbAwa{"&dʘyr_EYZm̦IpB%Xk IĿpE㿀_w_;mҼ_\hV(X#KW 2O!jd˄OWSrſrQXz5j>VpRݛmɦk)KFIAaMN[Z9MIlj,l=|U~;дzcj|k{⿇ki:}݉ΛxyLo Ņl3 o|axke/Z]>N~" VP喓xÚ{i߃dQ,7vc~ɨao|d%?i~?j/k⟆]_5-]tŏ0{7Ե*x63m^]i?E;RS\#öWJΝؓ޾Ǖ&&Sғۧ'&ҋA(Qea]ED}@ѹI.Ek}ò*{JofY7mvy΃ͻ,/C(~Z.|DU<ŧ]UG9)#ޞsYeM}tl/aǫ 1ujQT]UvYLM+_{{ 8s}+^,ʲe-z *_Nd`XT f)Ŵks_0MM!%|jO=1GT"&ֆL)E>K׮@3|A=0EH N'rLQtRf-Rp(Sb!Cxm_|:ͳ D@!%8/Q!_8"* ''\}&'9đBzY/̜I˟̐~o{dv;"3b:Y-r=~n+VfY}q "&%h_>L1+NdQC?t(Vk@Ũ&~=`9 kk=|Cc0o`U B3ƙ Li 0fxLƒ uLe{N=SUItrGQ. @ ҡo &W`ZH$LvGY^V9׬? 5( qP60A®)Eu+w9I.ʮ:r0x脷>+>` {+rfHȠTWYD.(⑼ԮcR EȵH}SkzgӼ})#G#X[aOs n%nNR:NGW G3 Xa8\60V8E*A.>'5hK, #.7͓LVA;GRT;H\NjłUA´99|הFm{C (F]ĵ-*5X@E sd(uI_ޠ];gVkpkM)lѢ"Kt8,bC{`L8.JA^c8 p8TD  |f# *dT4L)}tŴv;&"%AZe`#⸘l-*6١$Z(8:qu%90f4 Ll/**qP!",R2(郣$A KƻJr3lwS-B0g?8v@!T.hSp&m!f+< {(BQ<Faa,%|j06yܴc*9sVɤ0K7PU8H%Df0n+@Nx9a<Ŧ9<*d.ck [.l[h xЪ!AEC0-B%;qhJ f k^n!sDHG >1=O -|]8PkxGSR5Dak6A#l tY.2n|xd- XQU9ͦK=ޖ<I߈#(57AIJzҐU/7>BlZҝ98A>gI#$I *d9h\Ѥ j5ǸE7b8 2)\DhDUˁkTs`'qw</kGKۃ>PtQ:$^tWU.w$1ApKބ @H(lV[:ͮйlD[@,}vy`pCTK=,vϲ$hV}I6kz bnq;6(RZޢ3X4׏o h1RpYVPS9R:lk=T[@9U):4V~9F%)*ʉȸ9^~&y%p I#:* >UhNվ᝜tm 'HPC#UΪn1 a*<~/J.N[1goӿ:.2I]A Ò? Ѐ3}n_R:zunIk2)͖#(u˞.*^FV3 ߥq`G\E7)`\ZfNh 4ї(ݙmTItP5^1;MgH]3qqݡvZz0$SLl&Y*ݔ5tx&gIi aT7v&^ =$PvEʤjh}$ML0wȸethɰ O}ͭJo}wjcFXjV6iLԡs|cQ _y\o}a%8%' DK+BZer@=zdBGb"f#pZ14,CL)^\m đ]̱wRNUVE䥏4ѓr DZ4Ү8XCĶݟvu> )`"Ѝg֣m/Gĺ*^H9rَ{|޺0}7=b O|^W̅w4X7VuA^fQ1:kH R6nV6h 8Yx|˫6frpQz6W➆'Iv>_h`UZz#z|'x {!s˃v) T+(AN|(Lo0*1\6\ȫԦ^hA͎.cɼ>ڭf )ظa:q]wm&;\". VTqz&a.ve{o?3[}JH*[RUs)=e]IK sPz ĘQ4Tzipmy'45&J|cж' q-\3W'! Gh"OzE8ǥv;HQHB\jgb)*P/`CMn嚁"9"iRSSg $_iMyލ;Lx% IYobEIvݳ,YCLfb*ܧV:`I$B1$"ʼn'rD1Z8Wヨ ū ̏H1uR5=;a>@./䱶 %UrS311|cFu}I.rJu dh>S]ưx̺HGJ.=61?pP!Jd 32@&悠z Pf!TS11f2 K/ӧjX0/`bo(DʆC[Ք\ >FTS"T m^}S ł}zen(Cfi@޷Ύ+ҕi7hI=6t-Xh-|lEh`sB,De]Lo.15:3.V7lfIj(AKj]E^b=%/O{Z6@8TM:BWox្0>cm -/&g?D`ŕivO$躽PQ+*t[fok6.pc80ndtW( C)e%&\|@UH1͖/p=$5<-.o3eX+-; +UEEbÛh6f旀Pk(פ-y),2`B> Ld7MŷNudP+rZZ)PD/I   .=ė䲽뛰k|Npn<wwt]OW,s!Kb>a'0(KO{cMQ]gNOp '3T-ɂGjbײo Q1΂@Le݃`Wou+Gmei[d)y{ I-xuFD 52N>0.R_\E5+m;4FAςM5mKgS(Lo~Nࠔ6O9D󦵢8}{"jgt29Ӳ,_O&+*e+k7HDP+.FcEo(g0pw..v|?r w e9ŤLw=U71 ΤV hAV[wd et(f;'g7v!~w2*֘4fzE8kMn6o/޷!ِ}c~Wl"o\Bl`MѾ-/Ӂzmq`, P.ErB?Dcv=. ./ `+}ܺ>x fUPeG߇Z Xo9-_˞ 1`hy ٕ4M\$;8bjSL!ϴ[AY]@@lUđ&"R|Fe j3_00IB 䗻ϼBbynJR/)X;"PlhD` HE/ZϊEx&z8e`ЮigI&A=$X619.vgWxu%'e8r…˭LH-Og*o;\hߛ~_: avf |R)/AT7Fn5ǿN\LlTCHկr{g32Px 7&ED MKx LOLvS7 b oA^&HF^}xW0!|ic&_8,EΓ-ؔwtLg/&j!Od`Ba)1Cx@"mމvz (Ϛ&F PUX"!O@K3Y8>Ca~FO6 . - (TD(x)D@0[wKrt] d7.u3>y(3A+W@ܲ.[# okςP +~8ʬ^?/*@"+ 8t^K,\h Nqɬ!9~-J !>۹9|tRgYB!<뙰X1#@ B eX'{[:\錂L:FƕCK3M]z!> i1S Qgѹ5(/p .XD-,7-_3IENDB`nQg$$@&lC\PNG  IHDRdcZ9UPLTEWNJᛁŽ[6壊ygF،r{v諔}aڥݔzӄilD6DzJ5פ3,)淣x¦¬P$ҁfk8&֝Z9Y6+½eV鰙{us`XUdFy]qb[VBۑvwX%wgɹ ɄlzkdI)ֈmi-vZL(lec}SE_CpQPD@C<9qU=#jOiE0!؊o禎tY㟆Q,oUL^=2lF)ċw~^ST7w^@3.lNߘ}aJмvpm݃e辭mXW. lK?ꟃֆjsϐz=ُt|{b.tRNS< bKGDH cmPPJCmp0712Hs IDAThCW1!& Da ŠFS@n`!+GmD+ߍ؎U^ss\ X1>]_h5$:0D"d$vu[s/z5$nܺm&toeٜ-h[RRW)E: T73_s)_6/Ȓ۩hƵQ_ٵS_iJd[tg}0٨os3mqӒ.=6rw%v-'[=$U2f/[oVnGk++/W-G1HetnmzJuE/3=ŧ/kh×븰]h'vivsS~MG)rAWNmu;z?HxU-g. %ZƵT\Lϕ7]zy7u%ˬlB4z-Vui$_rRG66ct9[?7mIJtԐ|I-ʸHGՈ!3|\WZkv$}`19|dKvHZ=2FI~9IÂǞo*sS"Yp3D*LN=[_RǵB7jƙߏs'T0F Η?!8JR9!HZ3CcQxrwkǗK_F\aq!qs}/ڣD`/n5-_rJ$K at~ǫWDYTb3G2}^FM<=ft&^qX,iGeL ե@&nvBgo{1,I S8r|_2Lxbns=]BW.KKه o5\BYLL?Vڕ&m/<ax?>zuz|zgggb5ZѭMLF 8"x4u&[۵E; }4>5Wp#to4hQh>\ML| 1ghRVP?qƝNg`(".˨,",K$| Mĥm^gYj6OcIi,)H(Y^DGZ ǡKYqGc>nޖٔ 4K HD@,!$5V2 Exl7w;ۖyoiRaYd (&#IIApMCH UdRXynӕ7ָ5VI8$XA1 4,iK*>ٮ]ߘ;3Aa(VNXCaj`-$PAQMX`HT zWY/4lv)ph#@1L%IVA%\wAl`XTX ^.w>oڋ| 9 E 4!P2NjhXa$G(?i2qe糕&E4D:5կQ4 `[ق A =մl gmq0)0 Ec1҃QT>|l1FpKCRQ@xLEf4RdJ[$\3Q2p!RFBY I4}$91G*<7M>=L2 2@! `Vh(DQIQjELֈ^_췞!1a/C0x @A@wE`yb;7j2L@Df;%B9D4 S8),P=Y!©je/HCp-eR%`$ՠN`R=F p3X,f`HlC54W& ` bWwФ "0`cfZ%ń'Iiɚ""G~4!pep sD``PHX(A$s ̒bm\YbahLfR L*ioj*#rpUty!t?f .&4 u' ykcЂAG/h yH3^BGVwa0xxqxx~:?p E RKb1{x'Kٽ0O'ތTvcHɊgYPώ%WƮ&~<(Ilb|R ^Iyan8HdpVR{Ϩ g|u]Vka ߔwg 1{wz붦]EdA_AfPQS[߉{p +I;CBJ˽^F"1_{ZxVi6zW^~*'`w>IezrP陮t}7X$+}fu+Zx}{jAgmHw>eRI{+k5͹ ]M>XJIo[VhsCCrZ[MW]K_~r ?(K^WoBӐl,+͌jRs==ήu}?!S{jm=2;]Y E2|W幮? H_Ry~HHsvw`oU*4IcIENDB`n :uXgPNG  IHDR22]gAMA abKGD pHYs  ~tIME!]C IDATxow\w.;I"Z荋x R D[hiZ$M46Mblۻv6k;3'.&-}`}{cc -8zeyXnc0o\Xŝ"aN21M! "@E>Z|׏ 1I1۠dO]Z|޷ٱG>+piQc!Ƙm!J1栿3NZ+KyRj8B,<v:ݭ>Y[e1ƶm9|(P7XƘ(VVVZhCu%0i2$ }bm\Jٌ1ZY*!1^YyYM6Aik!N[Zi/@76;mSJmZ\ZB^h4T,Θ-Ƿ5dL9_t0x 70q]clY8!^*¶mu0h <%zxwf:"AB WV̲LJ mÀGv:q^J),D[jBXs/Np]Rk}EB` Zk0AV>!4 C!*5vYZ\0°1.p82H՝4MiQJ)J)YeY֬]&>߉'&iYiQEUUom5aHus\Dbp//VU%B(Bs۶cݫZ!tz]_R*kxr~"}/n!DԢ(ru<6Ѷmq)c4"6"P iB,7;;l IV+˲VQsJ)RZ6Dc tVJ~R[⩧4Bj6h0.^ ,keYnEQ*`8:ꊅ-ZnA՗N^WOj$R*ZWU9ʋ~޶m$n6v;˲$I }oaa^1N˲L&yCޓZ>zpp@Pxj㥐dbUa\cfLq$Ilnj( 9c<18ν~k1JaB?E>G<1FOJт0kiVow8N V7g?VF)]oSjI4 qNٳe%IRUUY`0L22o-TYowZyTHQJ˯qm< vsssvlFQi.TٳΝ Zkh՜sH#P މI1>\p? ͭSg^!4 u8S*˲8 p]uXU{;/ǣf |aaA֠_J6,4[Mf]Ͼ؄RJg0 x<A pPl- 0:A9ؾF_֯@- ;D\ַ0o@pGqS5ਮ6 0Z!(C:tg`c˲#Y NQu&j't:L&EQ uhfw]6 _NX574Wv-.?]ܹsǫ} =fw^;orw[cΧۘIENDB`n `M3̢5ZPPNG  IHDRs?0CsRGB pHYs+PLTE $j@@@HfHfIgJhJiKiKiKjLjLjLkMkMkMlNlNmOmOnPnPoQoQpRpRqSqSrTrTsTsUsUtUtVuVuWvXwYxYxZyZyZz[z[z[{\{\|]|]}^}^~_~_``aabbbcccdddeefgghhiijjkkllmmnnooopppqqqrrrssttuuvvwwxxyyz{{||}}}~~~πππЁЁЂту҃҄҄ӅӅӅԆԆՇՇֈ։׉׊؊؋؋ًٌٌڌڍڍێێێ܏܏܏ݐݐݑޑޒޒߓߓߓᕷᕸᕸ▹◺㗻㘻䘼䙼噽嚽嚽暾曾替眿ەr IDATx흋JhDDHE(UB*6BRھJDF\ T]"T[J/R%r=3ݝߓ={y睙><{c7s> ғO8)O7oϟO\`3.\E=k~I'=䓟dɒ`(/ʋ.]SNyɩe˖-{_bŊW\^jժW^5=׽3po|Ӛ5k<]֭;묳^~6l7cӦMsws}߅>͛7h˖-޺uGmvŗ\}رcΝ;/.O}+?s5ܮ]>{/ٳ{җv߾}_ٿW6淾}upÍ7t?-z,L--$I=(PIc9H|6d3$V_V t+1eXckx fõL.xld6vl{w3T<f3BWomOEt-=7m~,e CD2꓉we۠"IxtZ'Pf˧=(ԈhzǷV&G=E{ģ uW*2HNx"5nV=\\q_}H-jF.c9[8ɔ}1 o˨Óe8-dĸInchLfl 6^Zk@bOv˚A]?Oa9_< b#7&>kdI{Ԃx^Fw[Axʺa?;$wuV-cYu0Yy,5ޘKΙ(*wE^(S=ԎGxuIUM[x<F.==8vx^>^9If+.g5׹yGwIrt'V*]53!cΘ+#M{2!LUnߜ.G{\n}'Fg߹uCX&0OH<]sEׂx:C' OEnF<{z,io':O#b+Dx=׀Ou+x=B{Z%Cnc(tmxb( OB33P5b(Ox8xm4ǭ|GטzU'&{TzrxTX7z8P=}x|*֬7'êgIENDB`nY!C8jK7h%YmQ0PNG  IHDRZu?PLTE!!!!!1!11!1!11919!99919191!999999B1B1B1B1!B91BR9BRZJJ)R!R!R!R1R1R9R9R91RBRBRR9RRBZ1Z9Z9!Z91ZBZBZB!ZRZR!ZR9ZZ1ZZZZcBcc!c1c1cBcR1cR9cRJcZ1ccBccZccccckcksck{k!k9k91kB1kJ)kRkR1kZ!kZ9kZBkZRkc1kc9kcckckkk9kkRkkckkkkk{scJskZssZssk{91{B!{B1{R9{c!{c1{c9{cB{cJ{k!{k9{kc{sc{{R{{k{{{{c{{91R1Z9k9k{sJsRsc{9Z{{ksB1c9cRk9{9{B{J{Z{{9Bc{Zscs{B9BZZk{Z{skRkZ{RZcZk{ks{kc{k{ƵƔ{ƥƭƭƵsƵƵƽƽƽƽεννƔƥƭƽֵƥƽενֽޜޭޭƔƜֽޜ罥έ޽ޭ!ExbKGDH cmPPJCmp0712HsIDAThC`[Wue/R%'O4a{qFdafJ-"BUCͳ~l̵-Ӷv?oV %llv${}OlĿ;s=븺WWAjM(ps?{4ӦYX^̖o޿"|䶯mO?i'KR"z:|ni:~nW?ɕ4k'RP0`F28r0>;_܍+K=_~/Cb\vqzb:E"TP|}?ޅkێ,>מؒ+Ȳ[$'YÊK9滾3{73Ջ%^m禳ӆM*nH9"+oS-m?h' jl&~k:6sD8)TH]Nqx_}GW*ssfl:<=nI$v;.Q;;}P.W\Ӷh挄`C.$>v9Rr#{YT l$N 0vN..Go[r9wJ4'GX"Bt;hlC]]tz9Ba17M$9n ljwᅸ< ;˵r.TN. C1. lgW&8$5 C2o/VXЋ:1h !&tWO/?\ݭx2M,\.aBм~$xZ AƗݞnLeeUspĤ+$I?H  D%O> $DPj|t5 '(ICkxf|ctw;X2_[\* Cd8,{|~iAI@vBwc_sWˈ$1>O /\2BQ %tnKKzD}`bĄ(~Caw Mhw6դӦGXOƴUUVI1\F 2`w7~")dw?Xj.(#X2H'q]cxh aMiw' c$b3L6f2ix|.m@Q0W aWD^pNb"*#xV#@$F+I=r#LwW닉EEI&TUMdbM 4L1xm 6wC.b+PdVWWx&ql7Њ@DwNTē"F oۖ',F:~<B@#~E~{KD?XA p̖J 4|E( i ~xeyHj9&݊nj^;~x 2`˞IUˆPjXrSٜM Ɂb{,kvDՔDHbF{ VcWTS ïx򩝬ץ_-AgfP&68:~#0]+\"Ź[d"z>+mC?Wb~0kkkwBak哯&noCoV q!Mё|L9Ī… )Hq01 w%L$ ?)\cApu$Hhz,nl"cq>ﻫ,W⺑,, tit!4i4nltlC?Z.X&i7.l@nW;6x:M`+C>"Ȩ77ǓYj "ERP2j_D7Ilq)eSMM승z}ccca #tK; o;IxHد%Yj|z^5a k+Q o k Ch^(Pi SOdsDHf zOE<^;.V t9o$1~$\/-M/$vV!m;6y=>ElU"s:!H1?W>%r@lb%Yze$ʐ`7/VdnNM1)z+6yEd@]+#dzAװmRsvБF :DmE 0|>r ڰV_*, \Z0079NJc8AK٥@"6+fvi)ɕ+hJ:jpE'bK~VB5(d P^.p'gB3J@h7$ B#:T&J"7w,>!JT} OBH  frH6\JX0M6^>]55*I8fw#dR#h`4&zsr9+kk 8ȽB4B~rCIӍUl. ceNJ챬RެU$J^dN EUuZm>]$O ?*o!U^)3q#F!GFզ< M`h.S OmA\-l [[@g ]΁5Dh:"=@k1 @ۂgy,$ ȟC>fGW0"JRP.4 7sl:+* _i[ BdJ!T)4Vrzut񠴪/ JRLP-EGцbq2NV 2ZiCH_vyVʓWgFh "/oc"Rn2GM!Q jE3鑈Q\Pc5SCP^1B5*iϚa=nv\ xP 4\J{y3_)gҺVε& K1Ij{$c  }-kJ*YQ/o!GsIK}'N! -S }QsKuJ?BQlDt sJ)E П^/L\/.")` h*1x{ƽNWSi`4%!,߷:ηVJ@9^^=4$[tΌ[ĵD N As1bu:6?CC4m4 Z1$~ h0ZWu3g۔v@[fibVӊNz,̈| ,O@:aΩA14jIhK% dջ #\Zpysz{6}H&SErI64R1c}LN&_9{/r@Ii5zEB;u_< 5`@SS]yB?urGV܎.a@ laʜ(.PV)oG.׹`/mEP,z d0?11)]..X&3J!`jnR4FjNMbz%;1RfӖYPZˡju Ѿ0PFXHY/]q>Âl).v=>CMKK&ӆ~ UV[b=JxiRљ"}##PE֌FO۲>^/5uh\ڕ>-^BM.BT@KhT!wR_V.zEpm=D ӰdBasi%t:sIiL+"Fk8=ħ ni\zu2liL AZhݖ?QPDJku!DXބc[́UoFV quv/Z4Ah)09'OaN"b+@c1r~h%[D>V `&O"`Z tMZoix,[MoͯAMj˯ րՐ@[=G(rx}w E&z@ <ͭ+]׶ r l2t4Oe)(NSZAy#,-ѕ|KWМ)y-wO>Q 񉂶@L &G=Dڽz@ k޾:R '3|O>\ `)/Nҁ/K=.Y@fV>3C+z[$}(3FP**-ďֶ6ChGEIAq r :Tl͚l4>o,+}hqV UpN1-nP?8i1CАBjj}#mh8[U> YwB7P1L{H)mG#+^Y,r ߸.,hzN+TiI!ٳOco=y(x`sCi(wBsJVt~Xw0QdY1N ymh8-\+/[Bgii O=h1H Z.FD@u40V|uѢ8Z'30b|\ хG^ΊMQKDIæ!،v=B{& c[,2@ ? MUS\.\+ڊzqVXƒ,$Ou4Zh3:8^tvd&͊:C]~7vGoɯ؜B'Hw!SY\j^B耴3?t$t8bh֋Ҝԏ .n<{nnɷwaV}ؤoP WCZ GzhPJUMz,Zڳ~|Eղ֏ f&s4V$ ^BxC,tj30Mh1i>_O[hw#_uO|⋝qKjC[lVT|` [h҃УRw33gxmt̏E=N9[>$1Ъat3u|۝OF!Π'  S`"4:?*XX;&%_S  $ugZ$q}7vVS;6 i+[MȻ 'Ǜu 'aoEOR,AMc掙wuhlz$v4=gS: DdY$("DN`Q_wwGgffffg>e tp@ :. ARA}tmP@p >;uuW˝ $5vB M`XQ=:p]WA"S*^i+v\뼈Rgh\-ҕ= ;S%iIo^l3 V-4B8f=s1FώH!ln.ԯh{]A7FPzSLo?u5qbtB7hnA у[[o?u*sc@Wi!$]a/c>t т/f|]AYZN8kbc?[/d|A)FǺ GQv3CSS F˰aȜXrfN!@A jaԭn7d\\^C!A6xpٶއ`,>6Q93ds\R3&L4[Ї`QDI!-zMwk:a5ayK_{!ߙ%=i@Fkx26mAl7IaM -IENDB`nm)ܢ@aH頖#PNG  IHDR>PLTEf3̙f3f3ffffff3f3333f333f3f3̙f3̙̙̙̙f̙3̙ffffff3f3333f333f3̙f3̙̙f3̙f3ff̙ffff3f33̙33f333̙f3ffffff3ffff̙fff3fffffff3ffffffffffff3fff3f3f3f3ff33f3ffffff3f3333f333333̙3f3333333f3333f3f3f3ff3f33f33333333f333333333f333f3̙f3f3ffffff3f3333f333f3Gp2d{لGz8cEqFr2Lr6Ux@_KLl6Qr:̳q@~Lʼ}d9mQ0p[xkP?uYH}`N^C3eS̠ve~mlZO3(᪒s<#~LF^tRNSS%bKGDH cmPPJCmp0712Hs$IDATx^]Z˚#l#< $8 {Nv~9h^ē~6jݐZ2Zu^_%W~|4^TիWW/s:%].+W|c{)##.%(|&2jW$(|=wϰM x2,W Lߤr'gE}elR=]6 nbRj^'f&pfƔ?6Bv~.S{l?GA4Rl>Q>Ftd=ӢSE'TXrsOȨWWi*#E/'!{&czC{|ňqu<칌y_W#S - ɚF+Xص.=0zȠ SקcEe?:]oV3:BN5H[ ;ى|u]Y o 骼c52 1 t}BV"NUȢ!L1#W b$V/4^@"= SfM c9q{%ȾoÀ&|`E;ZV.FviOx>>#eYԴ^m!j iMy;l=hby.BVeLr5a-|4`E(YL{T煚YA HS\yG<-iUϽ܄%1."mgIX5E[#s--`=1I , m>2iYN֦ wp!˥j9(+Fxi+k\icx~061s;VlLӋӊ>6j$4f1X~'^?ϻc&IcĪlAAV@q4mq O ʙXnB)99EGVA`'>eǼv X ]bb̼U0OzPaidX)cEP^_z7+wx1ws Ypf!g43x}zk[>/q_߇C }´t@M4gq>ng@B,:6Unv{Apv zQ߀Ilc-v[؀n^a69;9_&tW*u/\w6Ia`sgIlzgТvMMԳIBinid' \}jahDzo 'F$\/BԀ<'UXaa贄S :0'p t~xcbT$li\Y }7DkDxtw.d޷oe> v+ xUݾi=X <1a@va̗ImBF~_D'sIi~#u>\$'"(t]BEf۽pZ pj#„L'v˸31Qa 5g̃)gTKbKF}BcI"&IP|>Ĥ ,3"kPDjnL;'Is#mZSH}U@Vr dpgȗa vwj`lC RA3p]H(\r+e_l4~"@&g1z>m#6\,CtIokEdcToE` ,` H;4 u^hZ(6Z`J56{`!|8k(Hqa$:_TjCh`BP=Apl,4\#Q74L PtVWB,;$b7̀>~΢|[I@]l#Fm)2X* hQX3ΩZstƂ0y25!4fJ}Gypp{U}#MM!2@Ehhf ֖a҅%8k3j WQڔgám%52]My<Xez&u1yY~zpG<;Gi=FۼؾFe*dҙe,HRևMT Q&i ލVBa'R,T"i3dlׯnAJJ=>#P2Ji{ؤi،.;;[^ 0 &Q ym$\DI^0@`^<^Y1s! @SiN.E;4azQBZ6g$ [b2.J248`qXj"XM#J6MpKc PmiR@YԀ8oPj  %#L'+åYY"2ϼ-%$2V+ 3B#2Vࢆ>ዘ psf4˂L1"2,g6_s@fh ~yC%?*Qn s :W+ DG!2 RtD26<zUjiBP+uQ4 :2/alE)(-J {?xO9.2j ζ_f'n<F댸Pr]@2xXQFB t=G@W &M @`FM4!/Wsza94w7r4 k8m8i-$Y Uc_߲aHq?iuCi8L"%I̵Dtʂff3tqRLnY QUyۦ@QP5Җ4 'Bfi\ y3RV@~Vd"װt@ע@zf̈́d&~("Mhp14"sYZenofMRvwQ07c@ |\NE`=?b&Jq*K]{yU0H{O۬gl>zƪ&f:&el)hꉭ{Y)Bs lL?8gP3@Yʥ F,#l I](4:V&X IͨqQE՛u*p0 c>ƗSf> _@G`ZliӈECp'(Y FZLby ɐ A5̓z6(m!^V.㬊/sH 9&.tL$DȝKPy ~xo<ЛCr|]JW&I!榮QP (ɀY&h ?8;J+cB/vXQL@ hb&K$:2IXt`@G@ra*Bg4J}ߟVRU+Z)cjD_a0DžcUM<` 4uqOHnm;5~LZ8a$e*0ݻPKw D_qp66N%!R3y4&W "PhAд,QlDg<[|eGycdN%l]2{r\=q=^}i*vG &S{g 1рҘ+ 8Se 3&j!OV{T)̨=;9Mc^2M + |e?<~s3 $+ J:ۓeL&g* "^t5pC 9–㛭7oj N(w\p@cQ\&|M1jnB#`ݥ*N M ī59/Hvlk `6aYD2%*ˉ>n4,[o75CD`f%%mEvf5I9 bQ B[C{;&LZBOLD'iƧ9c2pʠ!bd<t[.J(, -&<%R٨#Vg412M:(L߬DPd/ 8Y%0WG"wӴM";>BR.{hpL,( ,%GA4\mrtH][γFA V#?/aIѢ5xE 7KJ[r0@#0-$͞'} oV"4fՠt M?L!-4)酥c =RR [ GEY봎kpư.=38{Kd+szCx,FA@:߯r܅0yj_mvCfTNdi2K2iD;Hд 89 ?4qI&L| C$F;MbF,D;gXF#kY-K`&Li[O2Ϡ!5Ŕ\FZ%뮇;YlB fұO1%( lɠYs,rgEagԶ N(ڧUc-6tș?uLCJ6%&e,r>!FQ㈬(:?ʨkr}L6]@49Ԋh6ip!b?q˨&c\FlԎr!#EGP6tBSl~ dl5t_tLu'ܐR&بIQh)**W IJud@fmg`.tf QāJZc \& Paj-抦d4D(*=;3`iQ\et{n\=Ru~V$1WjndzƖ:]bgCT e]:4(w1L[̔A'c 1H,68l7gL/ Y jUK ֘@N<tqz@/a&s@2b N[U9N˫6pVWf(Yij5{`wD f: m({2xb?KzXH\];D';j 5_%~7[?;Li3`cmP ̖. /-<>MsLNfY-%%"HmK cKvzL $dgyczc|'}F''$]h_r(cy>T;4a屄 ΍U!U#i&8fsQbDkMⴅ'̛ÜpvMPU"hpVE&@ƙ7T:q2ɸnK^֭,;C-$VAw֘Cܿ]aq%2> +>:zЅb'c~oh#'АU'KQR們{u͡i5}~n#7.3(sם&PˮaqxHy E1DCx0~?œWzBx YX,ઘ|Jxi`mY :v=i٢QnAא@`V %o%ELC%P(_jcof\#DEW:kE+4j,lGvr.OY0r V#]-T&- )mz%b lѼ*Ee䋐9+fa¯zIFe+kU]4bd' -S_u{cvZE5?@ HY3FUYv_BkbA*6.? PI[iQ(3?]wF|SQvjm힒D?`G u"Ŗ(AL]?M5z6Fv[v7:* LX?;9G 8MĮ_!uyCXy `t 2l#ΰcقZirK8vhkjܤ۬~TU'H,4ސh/Ma}Q۸@1>ڋˡiLXY[@ؐ3p3* <|-{3h6dfH:~@E65!sB1dFh ?-ik@ojʃmBÎ5+h@Z˼Tpi (ʓF<^tplx^rhq]Ts /S>\sq0Rp#kT^[;hO* تJhGK֘n*)jQlu03›lud׮Ƅ^H i"kX;+ll vI9#c=!:\Uv5w]i+#%/|$9S/]e +$4;u a4Iʤٺˀ.ܑܴSgCZiDl(w2Al>vu'Y6meC @띙?Ut`|Q,.ʉe2VN 0Y*n,o[RYH#4s7 wpbILDj)Qaką MS'-Y_~p:EdeMr[6ފ,i4Lq_Pic}ESF&maI7i GpK,s)jc[ ZIJc\D CS(N|ົ ZИڏIsaҸtV!vp S4~R(SAY]qq1,,I[y!.h+`+vYi= NJ.=ҍOwpbi٬H#]0PM-Ĝ,H͊}u|FFTI]=+S0ҴvMjp*=; >BXjǶqiʮb&Fywern`h%z~kY!m`˸c@C%XZU9'5Y =*KQ&z.m(jR4`;Mк RGƤR566Ln+ld TI'؏H7F`d `CaKFowgbd3;\ ̬a[5JY\i?%zq,[[˚WP_ƻ/2lgto P.} }G4oo绥U?1w*E2\b="{{lqiŖ${ ڢr~dSlYU$ia07ַв]%\ qߗْ\j}i_R=lǥ0%3|j99:-n:%l} c;o=vHEh !@p˝Ʋ#I8 G>TaB)z9?);Y3ˤ+9D~a.RہX"h&a_Ĝ &"~MwUBt|,rRkjBm*fU LqLovO4(E2*$'[. h J_edLMNý| t* JTi 4K 2mU_/z}U@W[=BV]mrlA RҌCj^ϩL/upc3}i 䕝K 22.  thKt> 9^FH~vLe -9THBeT 9Bih5->) >;Oz|y22f[  k feAñ[ acw(X$Ɓ1V&÷1Ǭd, X,: Mц#RW2SszF//1V(b8PjH1BG`'^`On Z^X/m?|{|}i<ހX'rH|ӌK F"6¼U?YbnDG:-oA>&#O~I6T$m;6]D"^p4/rMFug0I]Xutd/^ѹG'- !Whڠh7H&=M.ǐ?՗O qeV˻t8 C SRA^Nf|<)6<ݶ0rt(T5Kn, Yh!(EzK'/Bj}111|6/E~In-ei](Wh_Pn$l2St,H[~9!I%4Y &C@hIpnERx<8jUHȍ&oi%ǧ1z33=r=lzҎ{J#3 TM"6~dOwP%%aSbIJnq)QoR}$iWLJ8 pD7/=$ DOb)%΅ _9XRH<B 9lSUJ, Oa2S!$.\ty4@#&=u'lZ )TqDF.A%BPR"a&SFd[-#՗)._ҝ?rk2 \$1najGdMJ9ؚtltgπ7oRW@UJT#;AcyN:}Y^j`I$M0Db#dtrwXSlz,KZX%D| t&]'BTetB~2No@˂V@IDj9I!PqPn2 '0PFђ,77w]`e"y~`3oBYjFZÉsSݒ,\N#h^:fihOiMNXL|Ǒڹg?Pt: MoB:- f$ygJWK4 [%?g:,o+NރNS]!1(96vu=PG/6Y3{sl8kt_X]E/'E3 RNlc MT5G*Eګ%nȼ3X7v mSH(( GM7tY/qG[xSͧؽ{o4})Sk[\^ 琌e4ur#brZD;g>=H 0‚A$2skѡ g^~0httfÀه͈ܽkU;@)nmϏ'gy(G]N0㭰[w81ԩ ޞ7k6V1,'*8RZX|H{o aMbֆȑ¯,w.? #jZ|4ɕ&0dw5_'/.~`w2^wyVMxuk6:;s1ہ h- +6VJpݔ'g%.G b#q1hN}/!dQwMmʔ{y„zzӧd5NS,- WD<1HO)"bajpHvQc{bߏm *l/{~κ?G˳z >z^8gW&Y6gβM+6։a&oEg/|}B㊇N8_] EA҅k~oW懾A)՚#cqy&p!GёbnS:_S8"$pͼxΜM׿~+ZP-Z/dLY^Tz rߚ_|߾7럓Qvgdd:nkf$ʀEЁ$Xm!\=*u?kNxgAs$&@ŋZ^Z9qe} qVaÑY}O'alM$rrn`m,]*-!5-;V]Msj +$LkٷotE &3۱\ұTqs5vU/nTw6qҥFXwSd(K{mDH)]90aN׬9|d 6x}_}?9V`Jh\zpri"!=&&)~ۉ~aB EUǝ~h[ 0]$FX:{k/>{T~S%.'r\phS`,6;((G9FR ,hkd'_M+ o1j"~3sN<׮řGc׬ٳgS'] 6A9JUekϡH2*4Y|ppdS]}ygE&jhp͛_=ubѡ_{ X׮ٳc֬q >ϟz.f{D[Z ^۫z%t\]X?E0t"Kg=捛W7?73f~mхfqp/'%Bڔոe'‹Z1Г~QK}CSwcM*?5,R LŦ+۳cW^:H/7OknoO a (ثRIao* T;m*X?ՕԇErv[+u$lM7o̙k#94pt.L'ţ4F˱k&u+ )]O{[}"/Ez' بPv#=]+z/͌}X&Ecniiҡ7ZRۀHZC*ǽ".8-nHtܗ홷Q2T٪bmp X';>/j5!±# AV|KDa m PDVzxT,oh)/ff%f &4{+Wf=mܗ^ pyO!Mrj%ۭ{91r ɰIsqA; & f^SE &ֲfuEQ_j"B)AofӦMlذFVZҥ?db+>D08DAaj*SRf5k022ǩY.6zK{N#i>x+Naw:lAu DTDQd? 8NH%ӧE,?[Vp̟?+Vh"dYW^)oڵE= }y*Lݡ$)h2\d6iȲS0=1R6=0sNUkZ)׆anyN'o6=== >YA8p훟diaRY}ϕ:'&VR ILӠb,2nyۻLS$:p*"3Xp!.swQyv_`l8h)oAdx+pH'tUSW24:@kK=w-2Y?<Lo Og5-QY恩̳nݺv:ys^Ӌ&Tr`/ڞz ,)GER31<# Ϲbwؽ=OGQZ^ LSk[UҞ^Vt@l/d%򱼛ߐ 3DsT@6ATR{<8dlxV@1'46ՠ(+_~usxlѥ<ӈ;8БxY{?1 nb58UOU~]c(Jھ CG8|x(V I,gof HM+.JI/o%,6dR (ȒՎ"[edlIAU driL  Y"WH8,U#%R)ؼC2#Sð@&) ,`tttP[[KCC ޛiy=A .d>1>wa0iTWW3w\Z,YBcc#˅,+S.P(RÃh8M25Rc,5\Ò%KhiivrJg̗Eyݷ^$9f7<;fE[[>ǃDQ󬟎@SS-c(O~ yAOODiooq8'o..zټy3|ߏ磡n7`.2\ ˅fEQp.%.(4 *q\.|?1}/aS2xIENDB`n% K)هPNG  IHDR^xPLTE!!)))!!!!9!J!)9!)J!19)!)!))1))9))BB111!1!1!)1!91!B1!J1!R1)!11)11911B11J11R1RB1RR99!9BBBB!9B!JB)B)!B))B)ZB19B1JB9)BB9BBJBBRBJBBRRBZJBZZJ)!J)ZJ19J1JJ9)R)!R)cR1JR1ZR1cR9R9)RB)RB1RB9RBJRJ1RJJRR1RZ1Z1cZ9)ZBZB9ZBZZBkZBsZJ)ZJ1ZJ9ZJZZJkZR)ZRZZRcZZ9ZZJZZZZZkZZsZcJcJJcZsckk)Zk9Zk9ck9skB)kB9kBskR1kRBkRJkRRkRkkRskZ1kZ9kZJkZRkZckc1kc9kcRkcckcks1cs1ksB)sBZsBcsZ!sccs{Z{BZ{Bs{R9{RB{RR{Zc{Zs{c1{cB{cJ{cR{kB{kc{kk{k{{ZRscB{Z{c{k9sBsJkJ{RZR{ZJZ{kRkcksscs{{ckB{JsJZBZRZ{ZZccckRkcss{Z{k{s{c{kRk{R{Z{c!9RZR{RcscckRkc{cJZ{scs{{R{Z{cJRBc{{c{ckckBZscsk9BJcZcsZs{ƔsƔƭ1ƭ9ƵZƵbKGDH cmPPJCmp0712Hs!IDAThC}}\ו zIF HK lI[%*QU$2uQ&"A8uD7YZL4dTN: hNiEl314g>{?|ﹿ{ι)o;z4Ow}y{/A~gїϋsG9_^Μ9s^<?gμ~??s0hدoΏߣA?C@~=O3I3ſ?ܷ{ꫯ3v^ꫯ|G0zzzN:ug3ό8?oΝ;uў#G?Ƿ}ɓvFutĪϜy'ssNޙwԩgƞԩѱSǿqTϣ9a';;' Fqà yotlhؘ?5ucljj-܉ǎc<2}kSѩ7_!3v:2:Y9+rnll?;7أ=Fu5񽽴Gι>H$253Ç}?p\Hdr4GFOG5Ԑrh9ǎqOÑ#n42IvDFԉ'ߌ62 0z`k\v=ixX s}F&'#L}${a~c` ǂF#305>h]Yz. 0EMb-]Rq]S~ۢ?q'xSx=q1]e:;>z \bqvL{VctsO'zvo z`po8.9M& jLn1Ֆ.lX=#\{qTUׁ{z0>4̹mzά75:n1;Yb x,:Ôzu qL"Bpiԙ-:Z1t:M^TJ9锖a:m ڈ+NSW~Gp8E֪JN!)tz]\2pʩ:UI`=V Z<44UUUr J.ht$Q.WtUfG)uzԹS=%%[q)Y*Hl*B\"%dͰ(0mŎjz}<9~&ubwۡJIdrJAPc(->΢U^tL;4jeFý9MgvoIQiڳmℱE~$ma)$Y=QX ,Hˁ0*Ck,6 g'2W{ Ґs&>j q] ꀠ<BPWh4Υn܀P1!Qn)KkcfD$SJ: NGG)z1y1ba MyݻxĢM F.##5MYO33~=~Lxml W fEK{,c1ЃA-N4Gz ,?D )K+Ʌ/'A f|.&>eR(z94'|f.Dt$VLaF! ׼y/]Zͽ t"c[gҨ h,\_W|7r' o5c !WcWҒ޹_ $x#۫wlٵe˶z+Ɣb{W/b 3<ƉDbZDxf}Nr+Y&:E$Bzˤ`subQ1G$jٳo0; y0AxIȳtRF 3= 'zZ \(rT7$K٥,!N>H3*XCF`=YjX,I&|!/g|֤͈E!1P_MS-{1?p((3tב.i!-6IimU‡/.&}Ī[˶?rwO qOl!<2+&P 8k_KlyĂ¿)tp4u G A|vl r> .m[ϙJl'<`>yLf.^"Um5dV7fqS:VVxIzb*<{VX_Y!_%'0`7k(rM@k2:6\MI3 1 RR@pF"McOS n UȘ2dtTR.~6{C$$ã.8yEr SJ^,A!o x Փ#K/.B@yͳ9 8nX4oa{Łή^,EId7ǓX@8 l* DYڃU 8zD}b1y\L_E)&a=eX p=KEK:3! wĒuH,'["W y==𢜜NO)na!JWdc}ATR E!EJQGeox4龐[mvn |y^\3!8QQo$3dZ&3#~N!FٓH\'U6fcT)^$V.|m/>OQסTzvvrff?}iՀCxbbhhhzۋۤzm[k:mQJօA>~3£fɾ {]LO8>WV$.w7`C[箒12g-3nȏ\$bt. '.B UVJdyMχ2$G-BpXr6li>fh7\<u> w2AחrO'b2pRCtxpXUel1ύtzQi3Nv+bxq9iY]]Sg񀛋'BC͐GM.x&F]p/SġJo؏\&w|<3LHKבtC>pOt@Z~Б1[1B.$`)?~뮨pBTV)UA`bCQtDŽ,Tc1tA\:MGB6"a**q̐pHL nΩfAfru|O/^/w3_'nF Y&Ltn8c/̠ؓ 6Ԙ'cPWVwd>~Z͛go,"@wA(\̅v7̠13jdtzƀ?.V>^fu7]1 Vi4ݘ32,g|5JH q׷{;xs$q>޹J`]BA7ůJX/6<4+YUK'<<=ww p6"x}Ztptr>'HhGyύZ8 =ᢟp% W"5 k{ܓЂ #}\; t2#_o u`r{Vn1LNG9e*z'œFS~ȃG|ϱϧ7wtSP'\*K((9ۦ4 $ӡղ'?l0Y&E"_Aʤ Xs4`ê<0q%LYOH 2mד`m3(*27hLyf5;po܋Wa~`;P=ಙ(?d&pl߼y{-9FG e1o=.β! XdLg| Ik/#i~"䞛R2)w \|Jq/ي:]tCـ28`ШƮ^M#c;~*6zZ-rZ-=ɻ@M@ t ^*yt5JqXՖ_;|5s is LRF>ڔ8<M52ak)fT݇L| ^M}5SWq@#ZљgAIP"vWvPYkpNtq)HNx ꒚@BKx'0_؈ȝq_"0:=L Kβsa~l b D M˃ڟQVM'ju=?kCt$N#rHS܇_ ^TU ن)aP(8Z-{vϬZ)4Cx5=_$ֶ4 xN;akxg=;^w(j!)hx'k ЁGkTxMZaٯO_7>O 1=: s(HۋonըJJJNCrsdٯ}y"~]/Y!21e Xt.A;G  DbQ'9Q,'{_ǃ6gzBhe'KM:ޣW*Q1/*n6;=7YZPv^QI= :@x{]AxzFƞw5[{dj$77m֭{8zH DrvyѢr`@QPoWVVH$RT\Z[[o---ݺu[mz'u_uL&t;xQ@7z%3 bKv7jY=~C71B<5;7%q8I/֖n^[>OťUz8<۰>n^b·j=Ese"{}͙0َQ8@0JUuAGײ[AזivITcǎ3 3~v;ܶ >'$ENV C}}\ߥܛo[$}A |Ҧ-͵*T./)-߄mǁ8'27b|T;v$ Ũ!l(E;`̅hk޽y<`l].Wb{^dC!ak[PiRwh/sɫ/-)%If$g_^Lo'R9^C{N1v FhG-p۷o?tճ>!mK)ۯf [^ӧO+Ǔ'W_pZ,Ѝ>z-vg7{w'4K4Y骆CTk _ѣ7?w{tܹњ|M}?y_?~ѣǿwc9u-Iy~|w~-?ȭk!#s-$-~j>9777=w AX#hb{(V.-Z&'?~#Nt }'w@h2 eZtwѻDw_}nfhPiyN*xt k1%Ֆjx;;}~;)ts8&v}}뭷^ݱ^Rmr9Ɓf`oJyIY7>y~οtv@BGqw|vZo?_t3F8:?!v.0!vdb+݆-@{p!~ы?Mpxm\hλ$tȤsKcX(u bGoV zF3.YKȎ{y!k5]Qyd=% n]ҥqav~,ЀO[&XfS VQZZ`c Cg@ٌ_ 4v 4@P*Ӏn 4&m2?[a6cBDȃ,0[+|2tKf%o{fMlMH@ׯ͋,/E E,l^klfuǁM!ï*Et%i\KMQ)(%z(`5#I%m =b =*ɟ}YGi|d3j>%)@5+up'E7zE}Zv^VVlPhv8N_ Xh,ѪƁvM# h-FTH1guy:dm}g3 h9 `C:MsF"fPHY50yu4+txuL{&o@gZl|cEfnveri73=Mc,%%  d:h@ԩtĆl ٪ Lih-p3;^7ltVNހ4R݂/xlUFIц!n㸏EjTC 0Š5\|xBaeFMG]}dKy,Xwϴ<23lZѮ=g_TJ2 }ˀ7l*s I@lS. СJ5u?ippa9MN-8"mϡn8L:ĀM@S@9N&0 +4W<Mb3a} \kL23gQ \'3<دr]R#D,aH1(eD|b$##eٮ@'4SC4<< hU`R$]UZШfMx { ˵O @g!i 6YH+Jx#􈊯rʧ [ESh Rho ?'P%N1lw ʬc_f^J`0 p>:,N09) !%B2\`BZЫfMNEI%YEnӀ.bjDG=+K}j ʸ)͚BoZpRf43 rtЙ[9y:=,;>dcۤ!B6uG&P ۗ:4^陷vF[. r~6.vqBù*/]8ΈIT`G!$à,VyPKyn 6Qr'msvg&pe%.,COD-OuX 1VXhlK?'@8gfRgzV M;?H8'VF }NrhCό& 2nR1CtFqQdU0~(T/ |#RXA&Z@JcW[TfˀuhDLė9h+.<2h7({*ABL@4SRMdУUO}'M f߬8+E]t=Óe,!.?\1XuhX4>c+s?GVV|Xˢ4SB8ui_V ] BN.K^4',؞˵vS̞R*_G3 :`+'o@g< hceޠ`}肅U:p9@˖hcp #^tFOtGrpvD+e&=,usɴYt 1UBh)|֋]̔(h?&[AgAHe)`~|!'Vq!,Y W DZ,lL]h#Uz $$sr0RАG*h8=6\吘#ǁx1>s?Az7} nB) QƱDL4~`Sa~OK>`pRlYe ZGJ? g;TZli $%:8%t@48A) t@'ЪL+N< p|tfGh3o8y hT0qh,@ ?'z &. \$͞3.RC,j:t4=Ϗ0ҘbriM4CD߂iB^}sNd/dbuG:ӊ45̼l-.ާwp t>:Q 5M 3 f*ہ*M:qϘ8V:[G_b`Df)y{b=@q8e_9ṟɮÖ't$ 5u:b'L_hgLI zd"c*A~CϭNz.N[w$>n!<*f7+ѣzc954OGHwn~b<$D9[f0/pUu@܊J_h}C:\ι`\+@ou2HWL$VԷң+nc5_nVm,$\ü+uyZ~ 0 tՎʕ^b&~ghމ(+P"ihVc`G9%.9Ў\rok? 8SDznFv>0|bF̌4.VdZiJ>tԅXRɎ4ZaAΉ0Ԕڇ6pם IC̱㊧%=_v-T')Ehf>q 3bOI&efVv\3^@ہh.G~&zJ#*u-J jo9M!Zt~g^aסyʅ>&/f -B )POryLDsn7YyJ`W%'?a:~ 3mT+߄bTZ֓f)kI: ]$SqsvFGܰbdӀNkS*4/ 7t:^B9Mj@Vۖ5O3 7H5B{5/tSuf)m |+WGr{b%|(h>w<д7%G^,6D'T7~o) 6I!{-;Q›Mwn;gd4g ozԘ D|m%'ӛ@'@ϫ]T{6}>Gx ¶ُy6$u'U 6 lQPD0xyMj=-@&cqgqU! }|n :8yRyosA2.s\$ݥ zu}E F8G*و$Nt 1 ) ql hEh*e!N}pP?)oL)DR]g`R(sڡB: ]Xe͹C WYGd&ӗh2-@#jdN#4Ь,*OU'H Dq@c驪UV9>#FR? RbQQIq+7-2 2 ߙVLЎ~x@;igMX+Z+F:i.BXPNCg.SA@kM ) EI/;ᔑ^`1lnLOp%I"qR0%qDQl߄$Nr 4@C;}){~[qR8\b撠 II¤p@oib[ߢ1֢F0q~-yG"L;yZO Ifr [5ZC?/MS\܂"c aE6}6JKXJzUf3sR<6T5Y|xGQ_8ݳ½nG'Vp1.Obtn-ȾԸʜB\kn-PhE0yFӭR:o6)ʛQ pYp:\. ۂ1:݅o?ȗ:%!˄T+"VБ!cRSy\;ڧXŷxh@O2io 4:rh?JE/a=I*|ĠEb#e:4Zcg*NL"]|ֆ04",T ZV\ UqDz]X1%px>ScDp^\6/U,g'jÁ@e&bHDKQP/_5ЈT6/QQ b`^hXQ#Dž$CeNfHة5Y]9ƀd-[[\XίZttf6فQRAx;4:Ip6@&]VgzhòS_ArORgg9[E+__ hRA2F 63/%S>Z*QyBK|"ȭ*"-jAfŰx\+ꝔJ~cb/RgoShhJ%IL(ITI6ꑭSFb ur(a k%}|HO-=@w^ j?: M&xz#$aQoKOTް ` =Pd!7 &Zɂ:+߇Oz@ _סa *g^N4),jS(=2K/.tJf6Ӟ: ifZ*!&мHitN"@ϵszs]zm}'CWϴ#;Vڹ뀾q-=30 > BL^ nҩyߝP5:isQ[^h& 4ʓ _:VPB]D2֡4#* ]Ġhz(ؤUq '}fPDT_9=Ԛs@j*3c^8nGk(4n by[i1)H^BM'mݖxXsj{Wv+%t2 4R; B >KcW? @Ж4^XEU\C@gSOp9s5)mH$r It&xxtԏs)@C)": %׸ 8BMkNdʲaƀF@V|+z<#h][B-&|7qa2ApʏRC̠*.qb pRPh$<5DD\ilWM4 @qM5arBW:mMpMUN 4*fVb,h^hXhC.ǥ\۱M` zNoZlB|ǝ'<Ї|`C\eq ~ ¨O%m#8N)0(9Ǵ5Yχ޹$wk&ҟ pU"zob!<ЉbAi(Beހח1Lklc%IvT؁ōH9Ў({ڮTJLRᡈв&9!K81^l|N">>5I1P"PӪAFEIplGޞ@DSQfo*5#k稧ІPfL%ٴHљZ >1Niar'zUu+Ā橁xRy.hb~ >+zՃ[K4m'>3#+i)400Wwf@XW|5z2ɤ.iM\[^i}9դ9*lOz:+Ņ&r!>.pvI\X^2=*GE-[8ҹ+zmЙk@gl L73 rtЙ[9y:UmXk.?t7HL 8טyE}&h&}:is47YxD$2=0l~5MdY/k@Y- t$vn(7tqx)_ű5ϩ,A]٤ и?AY["q=y@6U Fd{K3(zFfWP[ ЮD-ndVO\hW0V@jpgrA 87՘gFDWRaӝhdyz 7S>53DkTusl4”\v&*A1opy7>m-ĦۙayΪp^ֳr-AD98Kj /GB׫9ӺVVNL.dJv +].M#uQN@y+c5'(%j ܩitVNހ4x:`+'o@gi73 ^i8E@[l&tBu%@VѢjJ5sHhƪIlVWt֡W@"pGk|=[h /hhh؃'-NhCK&4q9GDcP#hPA$W/jp 5 A_߈ z^1^TOǀѾB#o;+Ј bad 0##<um}j{@GMgpZT@Cy*xdWSU<_hc hts9dF3 kH1_c\:h1~ne+Zht#1N~RMF] 47;xs^af4_`|?q=o) OSZ\ rSU3)iȳ](dT"ϊU^uzj_}hj]êl@gڲi73 udޡ`3r4㡳Ϻ?h?{,\sGUWEЙd,q$7|L T-r[[)tf0yghc[ ]ؠ. 8@ ]ؠ.B%ey*4osXdgEٵ#7V0l)EE:9@h> !IENDB`p9( / 0DTimes New RomanTTwܖ 0ܖDe0}fԚ New RomanTTwܖ 0ܖ DArialNew RomanTTwܖ 0ܖ"0DTahomaew RomanTTwܖ 0ܖ"@DWingdingsRomanTTwܖ 0ܖPDGaramondRomanTTwܖ 0ܖ C0.  @n?" dd@  @@`` <*,,    2  ! "# $4%& '()*+ , -./0 23 456789<b$M>Z+}#b8^-R$.Kb|M-R$ ~~PEVz {b$D;67+}q5@}!b$Qg$$@&lC\b$:uXg b$`M3̢5ZP<b$C8jK7h%YmQ0a!Nb$ܢ@aH頖#u) b$]֢Lg&$3b$`j>94D Zb$ K)ه%%fb$`e0 0AAP|ff@ff83 ʚ;ʚ;g4JdJd 0ppp@ <4dddd w 0Tv80___PPT10 pp?  %O0 Thread Basics     Introduction   ^Process consists Process kernel object + address space Thread consists Thread kernel object + thread stack Thread WL process s address space -Nv z_x Ut>e(Wr address space -NvxeZ&ZZ'ZZ:Z&          Nv       &! Introduction  Process ,g/f\bk NRv N PL z_ NWLNUO z_x [S/fN P thread v[hV Thread =~/f(Wg PL zv 0WLgQ[context 0-N^z &NN(WrL z-N^N[PvNu Nd t           Introduction  If you have two threads running in the context of a single process they share the same address space Threads can share kernel object handles Process Vphszv address space,Eekw thread O,mfYnjn CZ$Z^Z , ,ffh         "A path of execution with a process##( #   "Writing your First Thread Function##( #   RThe Create Thread Function YUO^zThread**(&     N[ P{O    N[ P{O  |q}^z thread vAm z(    $Thread Kernel P}iW    % :c NO w wBaseThreadStart Q_ v]\O`b_(6      '"_UR thread   (#   BTerminating a Thread B}P}thread vel""(4    RThe thread function returns ExitThread() C++ irNviP[, Ng|TS DLL gw TerminateThread(HANDLE, DWORD) NN[g|TS[,c[v thread 1\g*Rd eQv DLL Ngc0Rw S+T thread v process terminate~)ZZZ(Z Z)(                             When a Process terminate  If you call ExitProcess and TerminateProcess terminate all threads in the process ExitThread & TerminateThread only terminate a threadtR5% t      &      Zvu thread B}P}Bf, |q}vLp/fu?..(N      5All User object handle owned by the thread are free F55  &bYUOwS thread vrKabT?4     XYg`O g(u0R C/C++ function, ˊO(u _beginthreadex Nf--(\         $ˊO(u _beginthreadex6     vcfcg gOUL!  $ˊO(u _beginthreadex6     6!|Uv]Ɩ #include <process.h> &B       .* Global Variable & Local Variable !  0+JGlobal Variable & Local Variable WI z_&&(!   What s Problem?  Vp VC -v C/C++ run-time library p single-threaded, @bN`O_xd multithread Hr,gv runtime library(\<            -(*Visual Studio .Net -[   Six C/C++ run-time libraries   bStandard C/C++ run-time library &Nl g/ec multithread22(4      ˊ w Nb z_x, vu system |TS if KN, g thread Rc, GR global xe errno GRg|vuOUL &C+                   bStandard C/C++ run-time library &Nl g/ec multithread22(&      J z_-b] }hQ@SWxevX[SIcbgQ xeX[S8& (    &  )$2C/C++ run-time library -[  (W multi-thread tX N, run-time library vhQ@SWxeX[S,Ic. @bN`O_ link multi-thread \(uv library.(Y.'              LO w wpu _beginthreadex SNhQ@SWxevzlOUL ?.'(((N        C/C++ run-time source code Microsoft Visual Studio .NET 2003\Vc7\crt\src threadex.c gܕOv~^ P C/C++ Ut thread vfunction _beginthreadex(): `O^zethread_|TS _threadstartex(): 1u _beginthreadex @b|TS _endthreadex : vuP}_g thread Bf,R|TS(uOdfX[zzO(uzZ9Z!ZsZ9!:  .                                      N PfunctionsKNvܕO(     !$_beginthreadex [dx4      "$_threadstartex [dx&(     #_endthread [dx4      $.e/fvu`OWL int d=errorno; BfP      B}1u Nbv]ƖIcp function call vreturn 4     *%_beginthread {O4      +&  /)  ,' End     0` fy`ff3` Mj*333FV*` ffNNt^X` ffNL|>rL` +T3f3f` MMMff3f` Lx[he2` {$$>?" dd@,?nAd@    @ `  n?" dd@   @@``PR    @ ` ` p>> 42(  4 4 6 " `P  P cN NN}/kGrjL#j_    4 0 " `  0 cN NN}/kGr ,{Nd\ ,{ Nd\ ,{Vd\ ,{Nd\   4 6 #" `^ `  j*0   4 6 #" `^   l* 0   4 6d #" `^ `  l* 0  z 4 NA޽h ?texture_mid#" @@ +T3f3f80___PPT10. ` TexturedB  0 8(  8 8 <2 #" `   P cN NN}/kGrjL#j_    8 0 " `    R cN NN}/kGroRjL#j_  8 6 #" `^ `  j*0   8 6 #" `^   l* 0   8 6Đ #" `^ `  l* 0  z 8 NA޽h ?texture_mid#" @@ +T3f3f80___PPT10. ` 0  (  x  c $8     <l ^ˊN}|ў}vRpS 0   P  C (A PRINTER  << X NlhQ\O0 H  0޽h ? ̙33___PPT10i.kRd?+D=' #= @B +  0    P(  Pr P S 4 `P   r P S 4 `  8  6    PP  h P TT))?"`   TS+T function parameters  Local variables "+0+4    ZB P s *DC6 F 8 6 G   P% Q 6 P T))?"`F G   "OS (uO{t thread O(u"04    ZB P s *D6 ZF   P Z|))?"`  b(uOX[>e z_x"0 RB  P@ s *D`   P <H"` t &Thread d g ]v STACK"0&   H P 0޽h ? +T3f3f___PPT10i.(8D+D=' #= @B +C  0 ZR(  r  S 4 `P   r  S 4 `  d  T))?"` %U  Lvu thread function WLP}_g GR thread u}T_N1\P}_g '0'B     RB  s *D  H  0޽h ? +T3f3f___PPT10i.Z+D=' #= @B +i  0 x0 T (  Tr T S |4 `P   r T S 4 `  F8 `  I  T ` I,  T N))?"``  I  NVp kernel object Table N process pUMO>enN(0B     `B T 0D  `  T Z())?"`7l BThread SN P Kernel object  stack""0"@       T T@0))?"`r< 2xVirtual address space 1Yv}, .exe  .dll _N file resource"=0=t         RB  T s *D~ H T 0޽h ? +T3f3f___PPT10i.)@t+D=' #= @B +]  0 {@X(  Xr X S E4 `P   "" X # l`F3fvd @))?"  p xCreate a primary thread00   " X # lHL3fvd @))?"   iC/C++ run-time Startup code0   " X # ldP3fvd @))?"   f  bEntry-point function0  P X TdU))?"` Uv  main, wmain, WinMain, wWinMain"0Z       RB X s *D  "  X <\ L  4void main(){ `Ov z_x }0&    D"  X # lb3fvd @))?"    "|TS ExitProcess P}_g06     XB  X 0D>}--XB X 0D>-- XB X 0D> 6  X C BCDE FAA>@ :" X <g  pProcess wY 0   X X 0@tWr" X <m 'gK pProcess P}_g 0   X" X 0  X <pq33"`M@ ,$D 0 6la: /f primary Thread WLvAm z<0B     H X 0޽h ? +T3f3fz___PPT10Z.*@+ؠD' #= @B D' = @BA?%,( < +O%,( < +D' =%(D' =%(D8' =A@BB BB0B%(D' =1:Bvisible*o3>+B#style.visibility<*X%(D' =-g6B fade*<3<*X+8+0+X0 +   0 v n P \ (  \r \ S ~4 `P   t" \ # l3vd @))?" )  DWORD WINAPI ThreadFunc(PVOID pvParam){ DWORD dwResult = 0; & return (dwResult); }:p0  Y          $   $l @   \@ ,$D 0 \ T))?"` @ bSN/fNa T1z"0  \ # B CDEFAA  k.Zf@   " "V \ T܀))?"`p<  ,vϑO(u local xe NMQd TekvOULD0(       \ T))?"`)  p|TSSNP2 NaxeWKa"0 ZB  \ s *D` `pCR"  \ 6@"` U  Lvu thread function returnBf, thread Rmn '0'N       RB  \ s *D  H \ 0޽h ? +T3f3f=5___PPT10.+@+581D' #= @B D' = @BA?%,( < +O%,( < +D' =%(D' =%(D+' =4@BB BB%(D' =1:Bvisible*o3>+B#style.visibility<* \%(D' =-g6B fade*<3<* \+  0 1)``(  `r ` S 4 `P   " ` # l`3vd @))?" d  HANDLE CreateThread( PSECURITY_ATTRIBUTES psa; DWORD cbStack; PTHREAD_START_ROUTINE pfnStartAddr, PVOID pvParam, DWORD fdwCreate, PDWORD pdwThreadID);:0                          ` T))?"` h 4z*NULL=> - security *`O ^g ChildProcess SN X[S Pev thread,GR  >0>v            <  ` H))?"`c )7  &f}[O(uvXu'Y\, 0 -

 @"<    H ` 0޽h ? +T3f3f=5___PPT10.-0n{+)ȷD' #= @B D' = @BA?%,( < +O%,( < +D' =%(D' =%(D+' =4@BB BB%(D' =1:Bvisible*o3>+B#style.visibility<*`%(D' =-g6B fade*<3<*`+  0 +#(  f"  0"`6 r  S 84 `P   "  <t  zCreateThread(& )0   c"  T|))?"`   +DWORD WINAPI FirstThread(PVOID pvParam){ }B,0  @      XB  0D>9 ` 9   TD))?"` :d  `Primary thread"0    T))?"`V  *  t^zv thread" 0   A  0"`PDj= KHANDLE hThread=CreateThread(NULL,0, FirstThread,(PVOID)Data,0,&dwThreadID);0L0=4  =    Z))?"`  - security 0 (   RB  s *DԔjM }  Z))?"`6  - Stack Size 0(    RB  s *DԔ20   Z))?"`] w x-[ thread fun 0   RB @ s *DԔmP ~ PXB  0D>c  XB  0D> <  T))?"`Yw \|~~WL"0 &  Z))?"` 6  "Pf} thread fun vSxe 0(    RB  s *DԔ26&  Zx%))?"`1o "^z}Y thread _ zsSWL 0(   RB @ s *DԔmtP  Z+))?"` xVPv thread ID 0   RB  s *DԔ  T/))?"`9 a  aThread function"0    TT2))?"`z ^ WLvN z"0 H  0޽h ? +T3f3f___PPT10i.`a@+D=' #= @B +  0 hy(  hr h S :4O    h 0,J"`}D< int APIENTRY WinWain( & ){ int Data[2]={10,0}; DWORD dwThreadID; HANDLE hThread=CreateThread(NULL,0,FirstThread,(PVOID)Data,0,&dwThreadID); WaitForSingleObject(hThread,INFINITE); TCHAR Message[100]; wsprintf(Message,_T("T{Hhp %d"),Data[1]); MessageBox(NULL,Message,_T("1+2+3+...+10T{Hh"),MB_OK); CloseHandle(hThread); return 0; } c0c<@(8            > $     8       L h NO))?"`M &  DWORD WINAPI FirstThread(PVOID pvParam){ int* Data=(int*) pvParam; int sum=0; for(int i=0;i<=*Data;i++) sum+=i; Data[1]=sum; return(0); } 0                   *    h C B]CaDE(FAԔ ]aw6>y< @   S"  P    h C BCaDE(FAԔ a[3]Q!>l @   S"    h T Z))?"` 3 !  I{_ thread P}_g" 0 (     h T|[))?"``  hzsSWL"0  RB  h s *D 6   h Tc))?"` pW  ` D}T`OvT{Hh"0   h T|h))?"` cWin32CreateThread"0  r h Tl))?"`/  :Local xeMn(Wthread ]v stack -N40 N      RB h s *D/ RB h s *D # RB h s *D P h C (A desktop`H h 0޽h ? +T3f3f___PPT10i.0%L+D=' #= @B +;   0 RJ$1|(  |f"  | 0"` f" | 0"`}r | S u4 I!   &" | # lw3fvd @))?" jWM  | |TS Create Thread0  B | Ht{o))?"` IM ^|q}^z * Thread kernel object * Usage counter = 2 000 +  | 6\yf"`m y  RStep 10  r | T))?"`ci \Thread ,g reference  primary thread reference /0/@       | Hto))?"`C C  D-[ kernel R

 @S" @SP:"  T))?"` y >VOID BaseThreadStart(){ & } 0 &      C BC4DEFAԔ44 @S"  9   T"))?"`   l Kernel32.dll" 0      T))?"` l Thread Stack" 0      T,+))?"`m -  cT Stack top vnje 0(      T0))?"`2  ~cTWLv function"0   H  0޽h ? +T3f3f___PPT10i.= ɮ+D=' #= @B +  0 (  r  S l94 `P   ,  Z:3fvd @o" @U @VOID BaseThreadStart(PTHREAD_START_ROUTINE pfnStartAddr, PVOID pvParam) { __try { ExitThread( (pfnStartAddr)(pvParam) ); } __except(UnhandledExceptionFilter(GetExceptionInformation( ))) { ExitProcess(GetExceptionCode( )); } // NOTE: We never get here. } nAl] B %      .      7   1   NtK))?"`vP n Kernel32.dll$ 0      NN))?"`J&  (|TS`Ov thread function$0  &  NT))?"` a  * thread function SxeMO@W$0(     C BC DEFAAԔ&K-&L @  [ d \  NY))?"` P {  : vu|vu Exception Bf, gB}P} Process$0N       RB  s *DV  # V  N4`))?"`` @ vuWL[ thread fun vc|TS ExitThread$!0!B       RB  s *D`z RB  s *D*g   Ze))?"`": M10    N@b))?"`~ G  M20    Z@m))?"`q: M30    Zh))?"`   M40  H  0޽h ? +T3f3f___PPT10i.!`+D=' #= @B +  0 (  r  S Xz4w'g   f"  0"`Y<  Z|o))?"`w */f&T-[ CREATE_SUSPEND .0(      Zo))?"`S I{0R Resume Mb_UR"0(   RB  s *DԔmSmRB  s *DԔ/ /   <`] ;D OYes0    <d]   NNo0  0  Zto))?"`Z   *-[ Suspend count =0 "0(   `  <"`2  Fs(W P thread SN schedule 0R CPU NWLN $0$\        LB  c $Dp pRB  s *DԔS / /  @  ZTo))?"` Z e  .\ context -NvfX[hV

C6DEFFA++~&]=|-[N>  ,21B>R<c71,+*$+Q6+32.,!~& $@              `"`S $  x BCDEFXAA::7!_!.&N1N1wWE-wISjj{2Mkpzo o lQmgfd_[FN_wgg),@                   H  X x 0 &H x 0޽h ?x +T3f3f___PPT10i.6O+D=' #= @B +7  0 ] U   (  r  S  c4 `P   G  <e"`Z  uintptr_t _beginthreadex( void *security, unsigned stack_size, unsigned ( __stdcall *start_address )( void * ), void *arglist, unsigned initflag, unsigned *thrdaddr ); N .  . .. 0      H   <     A  8  ;   4  < 3f"`   HANDLE CreateThread( LPSECURITY_ATTRIBUTES lpThreadAttributes, SIZE_T dwStackSize, LPTHREAD_START_ROUTINE lpStartAddress, LPVOID lpParameter, DWORD dwCreationFlags, LPDWORD lpThreadId ); H 2 B2 03      3   C  3   1  4    `  c 8AQuestion2 z  BGXH.33 "`:  0`O|vNU? SxexevN#j,FO/fnjeWKa N T! X0N        BGHB33 "` ,$D 0 hMicrosoft s C/C++ z_^|v\D}p c z_x Nardepend on Windows505@      H  0޽h ?/   +T3f3fz___PPT10Z.=A+P!wD' #= @B D' = @BA?%,( < +O%,( < +D' =%(D' =%(D8' =A@BB BB0B%(D' =1:Bvisible*o3>+B#style.visibility<* %(D' =-g6B fade*<3<* +8+0+ 0 +k  0 z (  r  S $4 `P   r  S 4 `  3  <43f"` ChThread=CreateThread(NULL,0,FirstThread,(PVOID)Data,0,&dwThreadID);*D0<( <  XB  0D>C 5  <"` 1  EhThread=_beginthreadex(NULL,0,FirstThread,(PVOID)Data,0,&dwThreadID);*F0>( >  RB @ s *DԔpP ` S RB  s *DԔp# S Z  c 2AGp2right1 -  B\GHP  pv n`OarIWMb \! 0   H  0޽h ?  +T3f3f___PPT10i.0I+D=' #= @B +   0 ! (  r  S t4w'g   r  S 4Mm     T))?"`+  pcLN[R \" 0     C B]CDE(FAA ]YU0 y{[= @   V  T))?"`N 1"  h[]Ɩ"0    BCkDEFAAkO'L_&@  GS  8 '   '   6L}'  typedef unsigned (__stdcall *PTHREAD_START) (void *); #define chBEGINTHREADEX (psa,cbStack,pfnStartAddr, pvParam,fdwCreate, pdwThreadID) \ ((HANDLE) _beginthreadex( \ (void*) (psa), \ (unsigned)(cbStack),\ (PTHREAD_START) (pfnStartAddr),\ (void *) (pvParam),\ (unsigned)(fdwCreate),\ (unsigned*) (pdwThreadID)))r0 ff ffn`    #         =   ;                      (BC6DEF:g """-  "g\(,""]4y8rhLDH;0,--2G36*-"-@           `c"$` t J0   BCDE$FnIIl:1'  cc3P_?gg UF42C$F#l.#} W#>#+3<Vqx_E+"48@                        `"` m {    B<CcDE(FA 3[4<]<C<c @   S" R L  C $A horsen  B`GH I< ^(u]Ɩk^bIW0 H  <3f"`   FhThread=chBEGINTHREADEX(NULL,0,FirstThread,(PVOID)Data,0,&dwThreadID);<G00( ?  "  N ))?"` S    B &_beginthreadex !|U{O04     V  c .A langPC  TD))?"` h %R_NR N process.h"0(    H  0޽h ? +T3f3f___PPT10i.pm+D=' #= @B +  0 h` (  r  S 4'g2   N  N$&3fvd @" m=  4int golbal=1; void Fun( void* p){ int x=123; }505N       XB  0Dff>jjC  <7&: z1 _ thread 0 &   XB  0D>   <DX&& [  z2 _ thread 0 &     s *E&"`F  3  Wx=123"0    c $n&"`   T& "0    s *}&"`)    J"0    s *&"`   Wx=123"0    s *&"`  J"0    s *p4̙"`c  P  hGolbal=1" 0       BCDEFAffԔk @S" 2wj)     B{CDDEFAff>{{DD @S" 2 SvF  Tt&))?"`f  :X[S]v Stack -Nv local variable"04    F  T$&))?"`   :X[S]v Stack -Nv local variable"04    H  0޽h ? +T3f3f80___PPT10.'   0 H @   (  r  S 8&4 `P  & J  6p/ p <#include #include #include =0=h               N 3fvd @Ԕ" }> \int global; void fun(void *p){ char *name=(char*) p; int x=123; for(int i=0;i<5;i++){ printf("===== %s ======\n",name); printf("x xevMO@W ==> %p \n",&x); printf("hQ@SWxevMO@W ==> %p \n\n",&global); Sleep(1000); } }80JffF                               <o"`/ %6  lint main(){ _beginthread(fun,0,"N_"); _beginthread(fun,0,"N_"); getchar(); return 0; }\0\v           B & |"WI Local Variable0  V  c .A langPCB  H&))?"` V  4ܕuk=: ˊlaiQ P thread RpSQvMO@W"0B     X  0 J H  0޽h ? +T3f3f80___PPT10.'Ou  0 0(  r  S 8 4 `P   r  S  4J  >"  68"`/tf B error C2065: '_beginthreadex' : undeclared identifier0C0 |64     J  C "A snap :  T))?"`  H v$Project->Settings& "0    <   jVC 6 v-[ 0   H  0޽h ? +T3f3f___PPT10i.'+D=' #= @B +  0 ld`(  r  S ( 4 `P   J  C "A  snap H  0޽h ? +T3f3f80___PPT10.%R  0 @!3 (  r  S '4 `P   | 9g  3 #"."M=m9g  ( <*?p 9g   T N, Debug Hr,g&  (    @` & <$-?p g  u MSVCRtD.lib      @`  <:? 9p  D|Import library for MSVCRt.dll (/ec single thread  mutlithread)&?!h           @`  <4<? p  t MSVCRt.lib      @`  <pS?9   T N, Debug Hr,g  (    @`  <b?  u LibCMtD.lib      @`  <d?9 5Statically linked library for multithread application06   6  @`  <8x? t LibCMt.lib      @`  6{?C9  T N, Debug Hr,g  (    @`  6<?C s LibCD.lib      @`!   <l?9C 7Statically linked library for single thread application08   8  @`   <?C tLibC.lib     @`   N|_ж_ж?9 g Description     @`   N_ж_ж? h Library Name     @``B   0o ?9ZB  s *1 ?9`B  0o ?g 9g `B  0o ?g ZB  s *1 ?g `B  0o ?99g ZB  s *1 ?C9CZB  s *1 ?9ZB  s *1 ?9ZB  s *1 ? 9 ZB ' s *1 ?p 9p  - T))?"`@ Z-pUOY libraries x? pUO NN!kd[?. 0 ffN        Z 0 c 2A Gp2front1 ) 1 BGk]HL33 "` )i ,t;N/fVp1970t^Bf, C run-time library |vNTl gna0R multi-thread v`l;0;v           H  0޽h ?/ /1 +T3f3f___PPT10i. g+D=' #= @B +P   0   ` 8 (  r  S t4 `P   r  S  4 `    TD))?" ` RJBOOL fFailure=(system( NOTEPAD.exe README.txt ) == -1); if(fFailure){ switch(errno){ case E2BIG: break; & } }V0QO              P h  N ))?"` ~|  FVp errno /fhQ@SWxe @bNNUO thread Sgf9e["$0$P         # BCDEFAK@  S"   Z  c 2A Gp2front1V  `&  BGHb33 "` P Vu Vdk\ z_"uu Nx[vP}gL0ff  (  T))?"`x 6C/C++ run-time library z_Grk"0  H  0޽h ? +T3f3f80___PPT10.4   0   P " (  r  S 4 `P   Z  c 2A Gp2front10b:    `GYHC33))? "`g] p `C/C++ run-time library 'YϑO(u global variable UtrKa010+4    "  T&))?"`  Y errno,_doserrno, strtok,_wcstor , strerror, tmpnam, tmpfile, asctime, & K0K               # l/3fvd @))?" `6 < JNBOOL fFailure=(system( NOTEPAD.exe README.txt ) == -1); if(fFailure){ switch( errno ){ case E2BIG: break; & } }J0RO             Q   N<;))?"`n B   $ \e.zhQ@SWxevX[S _ZPIc20   C BCDE4FAA> TN=&&Z @     JM 0  <4"`9 z Fy 0error Icb function call .04      <@E"`I 6 #define errno (*_errno( )) 0@     H  0޽h ?  +T3f3f___PPT10i.O~+D=' #= @B +h   0    Dh (  Df" D 0"`*r D S 4q`    D 6O  t`int Myerrno=123; int* _errno(){ return &Myerrno; } void main(){ * _errno()=555; } Ta0,ffff            " D <[  zThread gQO(u v@SW0   $  D N_))?"` z PV Myerrno vMO@W"06      D Ne))?"` w % Terrno= 555; Icp thread gQ萊xe Myerrno=555;"+0+\       z  D 6m"` C% Lint x = errno; Icb int x= *_errno(); '0'v           D Nq))?"` sI  -[ errno +B#style.visibility<*%(D' =-g6B fade*<3<*+D  0 [Sp(  r  S 4 `P   r  S  4 `    Z))?"` x  M10    Z))?"`) x  M20    Z))?"`f xS M30  H  0޽h ? +T3f3f___PPT10i.D+D=' #= @B +  0 (  f"  0"`TYl  6Ԕ"`` r  S 4 `P     # lvd @))?" `} j H_beginthreadex(c[ callback function).%0@      N  <L"`c  P  @CreateThread(& _threadstartex,& )<!04      XB @ 0D)  XB  0D) 6    `0vd @))?" `OE T_beginstartex(c[ `Ov thread functionMO@W).+0 t          l  6Ԕ"`pP  Z))?"` S  (|TS`Ov thread function 0  l  Z))?"`V   ,|TS _endthread() ˑ>e aԚB0 B        NP))?"`]  XMn Thread \(uaԚ OX[>e c/c++ run-time vhQ@SWxe 0-0P           Zx))?"`mZ RStep 10    Z))?"` RStep 20    Z))?"` }  RStep 30  8  Z))?"`f  S *k^`Ob CreateThread SwON06       NX))?"`s  Z  Z|~~WL 0 2  Nf))?"`p 2  Nf))?"`  H  0޽h ? +T3f3f___PPT10i.@t+D=' #= @B +  0 (  r  S d4g      3 r33vd @))?" `qA3 unsigned long __cdecl _beginthreadex( & ){ _ptiddata ptd; // thread s data block cj // Mn data block f}ev thread if ((ptd = _calloc_crt(1, sizeof(struct tiddata))) = = NULL) goto error_return; & // \ callback function vMO@WvܕSxe ptd -N ptd->_initaddr = (void *) pfnStartAddr; ptd->_initarg = pvParam; // ^zev Thread thdl = (unsigned long) CreateThread(psa, cbStack, _threadstartex, (PVOID) ptd, fdwCreate, pdwThreadID); return (thdl); error_return: _free_ctr(ptd); return ((unsigned long ) 0); } n>k E 6y/                                                                          :                      0  Z))?"`    |TS_threadstartex 04     fl @  @ ,$D 0V   BgCDE|F6An!jH*1U/gfS4.,$!@          `"`nR  # "Bf CPDE|F4AA N{Qj\SKhGn p h~ b? qf 7P Y P+ Ma M@          P 0   N())?"`c@3 "\Mn Thread \(uaԚ OX[>e c/c++ run-time gX[Sv hQ@SWxe R/0 P         `   0m;    N0))?"`  ]  x|vuOULBfvUt z_x0 0   Dl    ,$D 0R   C "A face f 3 n   B6GPHH "`  8c NO, w w _threadstartex `ZPv?"0h           Z :))?"`<qQ  :;Nv]\O: 1\/f Mn \(uzz  ^z threadf0  4      <E"`g M10    <J"` g  M20  H  0޽h ?  +T3f3fyq___PPT10Q.`Y+4D%' #= @B D' = @BA?%,( < +O%,( < +D' =%(D' =%(D+' =4@BB BB%(D' =1:Bvisible*o3>+B#style.visibility<*%(D' =-g6B fade*<3<*D4' =%(D' =%(D' =4@BBBB%(D' =1:Bvisible*o3>+B#style.visibility<*%(+  0 (  r  S p^4 `P     Tn33vd @" `a lstatic unsigned long WINAPI threadstartex (void* ptd){ // \ tiddata block c[f}vMRe^zv thread TlsSetValue(__tlsindex, ptd); // \vMR thread id X[wO ((_ptiddata) ptd)->_tid = GetCurrentThreadId( ); & _try{ _endthreadex(( (unsigned (WINAPI *)(void *)) (((_ptiddata)ptd)->_initaddr) ) ( ((_ptiddata)ptd)->_initarg ) ) ; }__except( & ){ _exit(GetExceptionCode()); } return(0L); } p;$(N V                                    <                    N  Z{))?"` u .g_|TS _endthreadex,ˑ>eaԚ"0B        # BCDE4FA wmI1 N[ w. @    S" 5     `T))?"`,L x FStructure Exception Handle /f(uO2bk`Ov z_|vu exception b (uOUt C v signal function (uvO0Oh          N  Zt))?"`0  >\Mn}Yvzz, associate f}vMR v thread 0 4       ZȎ))?"`. ,$D 0 T#j, k P thread 1\ g]vzz X[>e global variable N2+0*\        l  F 9B  F 9B ,$D 0:  T))?"` B  0|TSO(uc[v thread function20       ZP))?"` 5  lc[Sxe20   # BkC DEFAA&L ^k@  )F 9 ZB  s *D F   Zȡ))?"`W g L;Nv]\O: 1\/f RM \(uzz  |TS thread functionv'0 4      <"`@- M10    <"`   M20  H  0޽h ? +T3f3fe]___PPT10=.U+sD' #= @B D' = @BA?%,( < +O%,( < +D' =%(D' =%(D8' =A@BB BB0B%(D' =1:Bvisible*o3>+B#style.visibility<*%(D' =-g6B fade*<3<*D' =%(D' =%(D+' =4@BB BB%(D' =1:Bvisible*o3>+B#style.visibility<*%(D' =-g6B fade*<3<*+8+0+0 +   0 b(  r  S 4 `P   $  Ht 33vd @" `]I  void __cdecl _endthreadex (unsigned retcode) { _ptiddata ptd; // S_ tiddata MO@W ptd = _getptd( ); // Free the tiddata block. _freeptd(ptd); // Terminate the thread. ExitThread(retcode); }v0LR                           #     Z))?"`@ V  ^vu thread P}_gBf, ˑ>eX[>e c/c++ run-time Libraryxevzz 000j        XB @ 0D)  x  Z ))?"`dU &;Nv]\O: 1\/f free \(uzzT0 B     H  0޽h ? +T3f3f___PPT10i.X+4+D=' #= @B +   0   i (  r  S 4 `P   r  S 4 `    6'"`p0  m#if defined(_MT) || defined(_DLL) extern int * __cdecl _errno(void); #define errno (*_errno( )) #else /* ndef _MT && ndef _DLL */ extern int errno; #endif /* _MT || _DLL */80RSR                             ^  Z ))?"`<  .[Ut errorno v function20B        Z|))?"`6   BXErrno |TS _errno Q_,&NN_ 0RMO@WvgQ[D-0&          *  Z))?"`2  "Yg`O[ multithread20     # BC6DE(FAA SVZSL.&LL6 @   : H  0޽h ? +T3f3f___PPT10i.@ x+D=' #= @B +  0 0  (  r  S d;4T`   n  6 #include <process.h> /* _beginthread, _endthread */ #include <conio.h> //_getch #include <iostream> using namespace std; void loop_fun(void* ch); // pSQc[vW[CQ void CheckKey( void *dummy ); // jg&T▋ z_ BOOL repeat = TRUE; int main() { char data='_'; _beginthread( loop_fun, 0,(void*)data); // ch cjxeVp/f void* WKa,@bNHQcast _beginthread( loop_fun, 0,(void*)'*'); // ^zN P thread, BfjgO(u/f&TB}bk z_ (Ʌ1u repeat c6R) _beginthread( CheckKey, 0, NULL ); // I{_P}_g while( repeat ){ } } 407ff'ff)&ff>$ff#                                     (                                      <U"`z   v^z,{Nh thread 0     <Tb"` ~ }  v^z,{Nh thread 0     <`"` p  v^z,{ Nh thread 0     <i"`Mq:: M10    <xe"` q:  M20  H  0޽h ? +T3f3f___PPT10i.p +D=' #= @B +   0 "@(    6 33"`'  x<// pSQc[vW[CQ void loop_fun(void *ch){ char data=(char)ch; while(repeat){ cout << data << " "; Sleep( 100L ); } _endthread(); }V0 ff[ff              :      633"` '  // BfjgO(u/f&TB}bk z_ void CheckKey( void *dummy ){ _getch(); // I{_O(uueQNaW[CQ ( NgyQW[O) repeat = 0; }pr0ff ff ff                        H  0޽h ? +T3f3f___PPT10i.ď+D=' #= @B +$  0 p$(  r  S 4 `P   r  S 4 `  H  0޽h ? +T3f3f80___PPT10.'`M  0 P(  r  S \#4 `  H  0޽h ? +T3f3f___PPT10i.$+D=' #= @B +r0x9~CI `M[cv )_/d5sA rPԞb$j%&μ ?I'V 1 1RTYcl!6lj6+n0wp9( / 0DTimes NewOh+'0T hp  PowerPoint Presentation Texturedtest264Microsoft PowerPoint@PId@@@( GSg  )'    """)))UUUMMMBBB999|PP3f333f3333f3ffffff3f̙3ff333f333333333f33333333f33f3ff3f3f3f3333f33̙33333f333333f3333f3ffffff3f33ff3f3f3f3fff3ffffffffff3ffff̙fff3fffff3fff333f3f3ff3ff33f̙̙3̙ff̙̙̙3f̙3f333f3333f3ffffff3f̙3f3f3f333f3333f3ffffff3f̙3f3ffffffffff!___www4'A x(xKʦ """)))UUUMMMBBB999|PP3f3333f333ff3fffff3f3f̙f3333f3333333333f3333333f3f33ff3f3f3f3333f3333333f3̙33333f333ff3ffffff3f33f3ff3f3f3ffff3fffffffff3fffffff3f̙ffff3ff333f3ff33fff33f3ff̙3f3f3333f333ff3fffff̙̙3̙f̙̙̙3f̙3f3f3333f333ff3fffff3f3f̙3ffffffffff!___wwwllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllmllllllllllllllmnmCmmmlllllnDDDClllllllllllllllllllllllllllllmD#JmmllllllllCmJsmmlllllllllllllllllllllllllllmCmmlllllmmlllllllllllllllllllllllllllllllllllllmmmmflllmllllllllllllllllllllllllllllllllllllllllanTTwܖ 0ܖ DArialNew RomanTTwܖ 0ܖ0DTahomaew RomanTTwܖ 0ܖ"@DWingdingsRomanTTwܖ 0ܖPDGaramondRomanTTwܖ 0ܖ C0.  @n?" dd@  @@`` <*,,    2  ! "# $4%& '()*+ , -./0 23 456789<b$M>Z+}#b8^-R$.Kb|M-R$ ~~PEVz {b$D;67+}q5@}!b$Qg$$@&lC\b$:uXg b$`M3̢5ZP<b$C8jK7h%YmQ0a!Nb$ܢ@aH頖#u) b$]֢Lg&$3b$`j>94D Zb$ K)ه%%fb$`e0 0AAP|ff@ff83 ʚ;ʚ;g4HdHdt 0ppp@ <4dddd w 0Tv80___PPT10 pp?  %O0 Thread Basics     Introduction   ^Process consists Process kernel object + address space Thread consists Thread kernel object + thread stack Thread WL process s address space -Nv z_x Ut>e(Wr address space -NvxeZ&ZZ'ZZ:Z&          Nv       &! Introduction  Process ,g/f\bk NRv N PL z_ NWLNUO z_x [S/fN P thread v[hV Thread =~/f(Wg PL zv 0WLgQ[context 0-N^z &NN(WrL z-N^N[PvNu Nd t           Introduction  If you have two threads running in the context of a single process they share the same address space Threads can share kernel object handles Process Vphszv address space,Eekw thread O,mfYnjn CZ$Z^Z , ,ffh         "A path of execution with a process##( #   "Writing your First Thread Function##( #   RThe Create Thread Function YUO^zThread**(&     N[ P{O    N[ P{O  |q}^z thread vAm z(    $Thread Kernel P}iW    % :c NO w wBaseThreadStart Q_ v]\O`b_(6      '"_UR thread   (#   BTerminating a Thread B}P}thread vel""(4    RThe thread function returns ExitThread() C++ irNviP[, Ng|TS DLL gw TerminateThread(HANDLE, DWORD) NN[g|TS[,c[v thread 1\g*Rd eQv DLL Ngc0Rw S+T thread v process terminate~)ZZZ(Z Z)(                             When a Process terminate  If you call ExitProcess and TerminateProcess terminate all threads in the process ExitThread & TerminateThread only terminate a threadtR5% t      &      Zvu thread B}P}Bf, |q}vLp/fu?..(N      5All User object handle owned by the thread are free F55  &bYUOwS thread vrKabT?4     XYg`O g(u0R C/C++ function, ˊO(u _beginthreadex Nf--(\    !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~     Y !"#$%&'()*+,-./0123456789:;<=>?@ACDEFGHIJKLMNOPQ|XZ[\]^_`abcdefghijklmnopqrstuBxyz}~Root EntrydO) (w Pictures;Current User,SummaryInformation(TPowerPoint Document((9DocumentSummaryInformation8 RomanTTwܖ 0ܖDe0}fԚ New RomanTTwܖ 0ܖ DArialNew RomanTTwܖ 0ܖ"0DTahomaew RomanTTwܖ 0ܖ"@DWingdingsRomanTTwܖ 0ܖPDGaramondRomanTTwܖ 0ܖ C0.  @n?" dd@  @@`` <*,,    2  ! "# $4%& '()*+ , -./0 23 456789<b$M>Z+}#b8^-R$.Kb|M-R$ ~~PEVz {b$D;67+}q5@}!b$Qg$$@&lC\b$:uXg b$`M3̢5ZP<b$C8jK7h%YmQ0a!Nb$ܢ@aH頖#u) b$]֢Lg&$3b$`j>94D Zb$ K)ه%%fb$`e0 0AAP|ff@ff83 ʚ;ʚ;g4JdJd 0ppp@ <4dddd w 0Tv80___PPT10 pp?  %O0 Thread Basics     Introduction   ^Process consists Process kernel object + address space Thread consists Thread kernel object + thread stack Thread WL process s address space -Nv z_x Ut>e(Wr address space -NvxeZ&ZZ'ZZ:Z&          Nv       &! Introduction  Process ,g/f\bk NRv N PL z_ NWLNUO z_x [S/fN P thread v[hV Thread =~/f(Wg PL zv 0WLgQ[context 0-N^z &NN(WrL z-N^N[PvNu Nd t           Introduction  If you have two threads running in the context of a single process they share the same address space Threads can share kernel object handles Process Vphszv address space,Eekw thread O,mfYnjn CZ$Z^Z , ,ffh         "A path of execution with a process##( #   "Writing your First Thread Function##( #   RThe Create Thread Function YUO^zThread**(&     N[ P{O    N[ P{O  |q}^z thread vAm z(    $Thread Kernel P}iW    % :c NO w wBaseThreadStart Q_ v]\O`b_(6      '"_UR thread   (#   BTerminating a Thread B}P}thread vel""(4    RThe thread function returns ExitThread() C++ irNviP[, Ng|TS DLL gw TerminateThread(HANDLE, DWORD) NN[g|TS[,c[v thread 1\g*Rd eQv DLL Ngc0Rw S+T thread v process terminate~)ZZZ(Z Z)(                             When a Process terminate  If you call ExitProcess and TerminateProcess terminate all threads in the process ExitThread & TerminateThread only terminate a threadtR5% t      &      Zvu thread B}P}Bf, |q}vLp/fu?..(N      5All User object handle owned by the thread are free F55  &bYUOwS thread vrKabT?4     XYg`O g(u0R C/C++ function, ˊO(u _beginthreadex Nf--(\         $ˊO(u _beginthreadex6     vcfcg gOUL!  $ˊO(u _beginthreadex6     6!|Uv]Ɩ #include <process.h> &B       .* Global Variable & Local Variable !  0+JGlobal Variable & Local Variable WI z_&&(!   What s Problem?  Vp VC -v C/C++ run-time library p single-threaded, @bN`O_xd multithread Hr,gv runtime library(\<            -(*Visual Studio .Net -[   Six C/C++ run-time libraries   bStandard C/C++ run-time library &Nl g/ec multithread22(4      ˊ w Nb z_x, vu system |TS if KN, g thread Rc, GR global xe errno GRg|vuOUL &C+                   bStandard C/C++ run-time library &Nl g/ec multithread22(&      J z_-b] }hQ@SWxevX[SIcbgQ xeX[S8& (    &  )$2C/C++ run-time library -[  (W multi-thread tX N, run-time library vhQ@SWxeX[S,Ic. @bN`O_ link multi-thread \(uv library.(Y.'              LO w wpu _beginthreadex SNhQ@SWxevzlOUL ?.'(((N        C/C++ run-time source code Microsoft Visual Studio .NET 2003\Vc7\crt\src threadex.c gܕOv~^ P C/C++ Ut thread vfunction _beginthreadex(): `O^zethread_|TS _threadstartex(): 1u _beginthreadex @b|TS _endthreadex : vuP}_g thread Bf,R|TS(uOdfX[zzO(uzZ9Z!ZsZ9!:  .                                      N PfunctionsKNvܕO(     !$_beginthreadex [dx4      "$_threadstartex [dx&(     #_endthread [dx4      $.e/fvu`OWL int d=errorno; BfP      B}1u Nbv]ƖIcp function call vreturn 4     *%_beginthread {O4      +&  /)  ,' End  ro*go0wp9( / 0DTimes New RomanTTwܖ 0ܖDe0}fԚ New Rom  !"#՜.+,D՜.+,    } pùjp(9)G 0Times New Roman sөArialTahoma Wingdings Garamond TexturedThread Basics Introduction Introduction Introduction#A path of execution with a process#Writing your First Thread Function.The Create Thread Function pإThread Wgӽd WgӽdtΫإ thread y{Thread Kernel c *UӬݬBaseThreadStart 禡 u@ Ұ thread v 14'Terminating a Thread ׵thread kWhen a Process terminate; thread Q׵, tΪ欰Oƻ?ڭnp󪾹D thread AO?8pGAΨ C/C++ function, Шϥ _beginthreadex NШϥ _beginthreadexШϥ _beginthreadex!Global Variable & Local Variable*Global Variable & Local Variable ҵ{Whats Problem?Visual Studio .Net ]wSix C/C++ run-time libraries7Standard C/C++ run-time library èS䴩 multithread7Standard C/C++ run-time library èS䴩 multithread>{]pޥ gϰܼƪsഫ ܼƦsC/C++ run-time library ]w9Ӭݬݬƻ _beginthreadex iHϰܼƪѨMD ?TfunctionsY_beginthreadex X_threadstartex X_endthread XOA int d=errorno; _beginthread d v 38Remark v 40 v 41  ϥΦr ²]pd_9testtest vD)p 8@ _PID_HLINKSA(xhttp://msdn.microsoft.co       $ˊO(u _beginthreadex6     vcfcg gOUL!  $ˊO(u _beginthreadex6     6!|Uv]Ɩ #include <process.h> &B       .* Global Variable & Local Variable !  0+JGlobal Variable & Local Variable WI z_&&(!   What s Problem?  Vp VC -v C/C++ run-time library p single-threaded, @bN`O_xd multithread Hr,gv runtime library(\<            -(*Visual Studio .Net -[   Six C/C++ run-time libraries   bStandard C/C++ run-time library &Nl g/ec multithread22(4      ˊ w Nb z_x, vu system |TS if KN, g thread Rc, GR global xe errno GRg|vuOUL &C+                   bStandard C/C++ run-time library &Nl g/ec multithread22(&      J z_-b] }hQ@SWxevX[SIcbgQ xeX[S8& (    &  )$2C/C++ run-time library -[  (W multi-thread tX N, run-time library vhQ@SWxeX[S,Ic. @bN`O_ link multi-thread \(uv library.(Y.'              LO w wpu _beginthreadex SNhQ@SWxevzlOUL ?.'(((N        C/C++ run-time source code Microsoft Visual Studio .NET 2003\Vc7\crt\src threadex.c gܕOv~^ P C/C++ Ut thread vfunction _beginthreadex(): `O^zethread_|TS _threadstartex(): 1u _beginthreadex @b|TS _endthreadex : vuP}_g thread Bf,R|TS(uOdfX[zzO(uzZ9Z!ZsZ9!:  .                                      N PfunctionsKNvܕO(     !$_beginthreadex [dx4      "$_threadstartex [dx&(     #_endthread [dx4      $.e/fvu`OWL int d=errorno; BfP      B}1u Nbv]ƖIcp function call vreturn 4     *%_beginthread {O4      +&  /)  ,' End    0 @r(    6;33"`'m 8// pSQc[vW[CQ void loop_fun(void *ch){ char data=(char)ch; while(repeat){ cout << data << " "; Sleep( 100L ); } }V0 ff[ff               6   6H33"` '  // BfjgO(u/f&TB}bk z_ void CheckKey( void *dummy ){ _getch(); // I{_O(uueQNaW[CQ ( NgyQW[O) repeat = 0; }pr0ff ff ff                        H  0޽h ? +T3f3f___PPT10i.ď+D=' = @B +r7+%0w;(      http://msdn.microsoft.com/library/default.asp?url=/library/en-us/vccore98/html/_crt__beginthread.2c_._beginthreadex.asphttp://msdn.microsoft.com/library/default.asp?url=/library/en-us/vccore98/html/_crt__beginthread.2c_._beginthreadex.asp/ 0DTimes New RomanTTwܖ 0ܖDe0}fԚ New RomanTTwܖ 0ܖ DArialNew RomanTTwܖ 0ܖ0DTahomaew RomanTTwܖ 0ܖ"@DWingdingsRomanTTwܖ 0ܖPDGaramondRomanTTwܖ 0ܖ C0.  @n?" dd@  @@`` =+,,    2  ! "# $4%& '()*+ , -./0 23 456789:<b$M>Z+}#b8^-R$.Kb|M-R$ ~~PEVz {b$D;67+}q5@}!b$Qg$$@&lC\b$:uXg b$`M3̢5ZP<b$C8jK7h%YmQ0a!Nb$ܢ@aH頖#u) b$]֢Lg&$3b$`j>94D Zb$ K)ه%%fb$`e0 0AAP|ff@ff83 ʚ;ʚ;g4FdFdt 0ppp@ <4dddd w 0Tv80___PPT10 pp?  %0 Thread Basics     Introduction   ^Process consists Process kernel object + address space Thread consists Thread kernel object + thread stack Thread WL process s address space -Nv z_x Ut>e(Wr address space -NvxeZ&ZZ'ZZ:Z&          Nv       &! Introduction  Process ,g/f\bk NRv N PL z_ NWLNUO z_x [S/fN P thread v[hV Thread =~/f(Wg PL zv 0WLgQ[context 0-N^z &NN(WrL z-N^N[PvNu Nd t           Introduction  If you have two threads running in the context of a single process they share the same address space Threads can share kernel object handles Process Vphszv address space,Eekw thread O,mfYnjn CZ$Z^Z , ,ffh         "A path of execution with a process##( #   "Writing your First Thread Function##( #   RThe Create Thread Function YUO^zThread**(&     N[ P{O    N[ P{O  |q}^z thread vAm z(    $Thread Kernel P}iW    % :c NO w wBaseThreadStart Q_ v]\O`b_(6      '"_UR thread   (#   BTerminating a Thread B}P}thread vel""(4    RThe thread function returns ExitThread() C++ irNviP[, Ng|TS DLL gw TerminateThread(HANDLE, DWORD) NN[g|TS[,c[v thread 1\g*Rd eQv DLL Ngc0Rw S+T thread v process terminate~)ZZZ(Z Z)(                             When a Process terminate  If you call ExitProcess and TerminateProcess terminate all threads in the process ExitThread & TerminateThread only terminate a threadtR5% t      &      Zvu thread B}P}Bf, |q}vLp/fu?..(N      5All User object handle owned by the thread are free F55  &bYUOwS thread vrKabT?4     XYg`O g(u0R C/C++ function, ˊO(u _beginthreadex Nf--(\         $ˊO(u _beginthreadex6     vcfcg gOUL!  $ˊO(u _beginthreadex6     6!|Uv]Ɩ #include <process.h> &B       .* Global Variable & Local Variable !  0+JGlobal Variable & Local Variable WI z_&&(!   What s Problem?  Vp VC -v C/C++ run-time library p single-threaded, @bN`O_xd multithread Hr,gv runtime library(\<            -(*Visual Studio .Net -[   Six C/C++ run-time libraries   bStandard C/C++ run-time library &Nl g/ec multithread22(4      ˊ w Nb z_x, vu system |TS if KN, g thread Rc, GR global xe errno GRg|vuOUL &C+                   bStandard C/C++ run-time library &Nl g/ec multithread22(&      J z_-b] }hQ@SWxevX[SIcbgQ xeX[S8& (    &  )$2C/C++ run-time library -[  (W multi-thread tX N, run-time library vhQ@SWxeX[S,Ic. @bN`O_ link multi-thread \(uv library.(Y.'              LO w wpu _beginthreadex SNhQ@SWxevzlOUL ?.'(((N        C/C++ run-time source code Microsoft Visual Studio .NET 2003\Vc7\crt\src threadex.c gܕOv~^ P C/C++ Ut thread vfunction _beginthreadex(): `O^zethread_|TS _threadstartex(): 1u _beginthreadex @b|TS _endthreadex : vuP}_g thread Bf,R|TS(uOdfX[zzO(uzZ9Z!ZsZ9!:  .                                      N PfunctionsKNvܕO(     !$_beginthreadex [dx4      "$_threadstartex [dx&(     #_endthread [dx4      $.e/fvu`OWL int d=errorno; BfP      B}1u Nbv]ƖIcp function call vreturn 4     *%_beginthread {O4      +&  /)Remark   1,  ,' End  >   0   p> (  r  S HV4`     6;  8XOULN: `Ocv/f jLp: "_threadstartex [dx" vbq_GrU? bq_Gr/fbC/C++ run-time vSY z_yQO, _N1\/f P _endthreadex @bN`OMb N(u |TS. U..  Pb(W NBf,1\auar/f N(u|TS _endthread() FO/f`O_NSNfxv|TS, NNS/fx[N N ]. MSDN 0                                         6D@  $OULN: vu`O^z thread Bf, _ thread v kernel object v usage count gXR 2 U? N P/f] SN P1\/f primary thread, @bNvu`O(W primary thread fxv|TSCloseHandle( (HANDLE) x), gb x  P thread v kernerl object usage count -1 (Bf x thread kernel object usage count 1u 2 b 1), vu x v thread function P}_gBf, |q}gRR N _endthread(). &NNR CloseHandle(). dkBf, thread v kernel object usage count 1u 1 b 0, |q}b P thread object V6e. 0                                  #                                 H  0޽h ? +T3f3f80___PPT10.'`M  0 H@(    6X zG  :-- laN: (la: Vp`OO(u _beginthread() ^z thread, @bN Win32 g(W |TS _endthread() P}_gMR,R Close r thread v Handle, `O(u _beginthreadex() ^z thread, GR|q} Ngk^`O|TS CloseHandle) ˊS MSDN : http://msdn.microsoft.com/library/default.asp?url=/library/en-us/vccore98/html/_crt__beginthread.2c_._beginthreadex.asp vQ-Nv Remark @Sk1\SNN.I0I:                                          * F        04H  0޽h ? +T3f3f80___PPT10.(0r/%12)81wm/library/default.asp?url=/library/en-us/vccore98/html/_crt__beginthread.2c_._beginthreadex.aspRoot EntrydO)@{y4w Pictures;Current User,SummaryInformation(TX     Y !"#$%&'()*+,-./0123456789:;<=>?@ACDEFGHIJKLMNOPQ|Z[\]^_`abcdefghijklmnopqrstuBxy}~  !"#Y_beginthreadex X_threadstartex X_endthread XOA int d=errorno; _beginthread d v 38Remark v 40 v 41  ϥΦr ²]pd_9jackjack vD)p 8@ _PID_HLINKSA(xhttp://msdn.microsoft.co